Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Как сравнить часть текста


Автор: MadCoder 27.5.2008, 17:18
Здравствуйте!

У меня есть две таблички, одна с индексами, другая с префиксами индексов (первые три цифры).
Как мне выбрать для каждой записи из первой таблички строчку из второй таблицы.

1 таблица:
Имя:        | Индекс |
------------------------
Клиент 1 | 143312|
Клиент 2 | 185441|

2 таблица:

Индекс | Название
-----------------------------
140         Московская область
141         Московская область
142         Московская область
143         Московская область
185         Карелия
------------------------------


Должно получица:

Клиент 1 | Московская область
Клиент 2 | Карелия

Автор: skyboy 27.5.2008, 17:42
индексы и их "префиксы" -  строки или числа?
вообще говоря, тебе надо использовать функцию проверки подстроки в строку.
префиксы индексов имеют одинаковую длину?

M
skyboy
Не забываем указывать СУБД!

Автор: Nuzur 27.5.2008, 17:45
Какая СУБД?

Если MSQL - SUBSTRING
Если Oracle - Substr

Остальное не подскажу.

Автор: Akina 27.5.2008, 17:47
Вот что построил Аксесс:
Код

SELECT Таблица1.Имя, Таблица2.Название
FROM Таблица1, Таблица2
WHERE Left$([Таблица1]![Индекс],3)=[Таблица2]![Индекс];

Автор: MadCoder 27.5.2008, 18:57
Числа. В делфи это должно выглядеть так:
If Copy(Text, 1,3)='123' then ....

Т.е. строго первые три цифры должны совпадать со списком, где именно эти трехзначные числа собраны.

Автор: skyboy 27.5.2008, 20:36
Цитата(MadCoder @  27.5.2008,  17:57 Найти цитируемый пост)
Числа. 

Цитата(MadCoder @  27.5.2008,  17:57 Найти цитируемый пост)
В делфи это должно выглядеть так:

а вот и фигу.
copy в delphi - строковая функция  smile 
вобщем, как и сказали товарищи, надо использовать зависящую от СУБД(почему не говоришь, какая УБД?! тайна, что ли?) функцию: substr, locate, left или адекватную.
учитывая, что у тебя поля - числа(зачем, кстати?), тебе сначала может понадобиться приводить значения полей к типу char/varchar через convert/cast или какой-то toStr(в зависимости от СУБД).

Автор: Akina 27.5.2008, 20:52
Цитата(skyboy @  27.5.2008,  21:36 Найти цитируемый пост)
учитывая, что у тебя поля - числа(зачем, кстати?), тебе сначала может понадобиться приводить значения полей к типу char/varchar через convert/cast или какой-то toStr(в зависимости от СУБД). 

Ну если там числа, и индекс в первой таблице строго 6 цифр, а во второй 3, то можно и целочисленно поделить на 1000...

Автор: Deniz 28.5.2008, 05:47
Подойдет для многих СУБД
Код

select Table1.Индекс, Table2.Наименование
from Table1, Table2
where cast(Table1.Индекс as varchar(10)) starting with cast(Table2.Префикс as varchar(10))
starting with можно заменить на 
Код
... like cast(Table2.Префикс as varchar(10)) || '%'

Автор: MadCoder 29.5.2008, 11:18
Спасибо, Всем, особенно Deniz, все замечательно работает. Обернул в функцию и получился следующий код:
И спасибо за ссылку на "Тренировка на www.sql-ex.ru" в подписи - давно искал, никак не мог отыскать smile.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)