Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL запрос с использованием LIKE [D7, MSSQL]


mefodiy ©   (2007-06-18 12:01:00) 

Есть запрос вида

SELECT * FROM <table_name> WHERE
(<field_name> LIKE 'шаблон_1') OR
(<field_name> LIKE 'шаблон_2') OR
..............................................
(<field_name> LIKE 'шаблон_N')

Поле одно и то же (field_name), но шаблоны разные (шаблон_1, шаблон_2 и т.д.)
Запрос нормально работает, но код как-то не нравится.
Можно ли написать более компактный код?
Спасибо.


White Barsik   (2007-06-19 10:06:00) [1]


> нужно неточное вхождение

тогда ">" и "<", или ">=" и "<="


Anatoly Podgoretsky   (2007-06-18 20:36:00) [2]

Не поле нужно, а таблица шаблонов, но только IN не подойдет, нужно неточное вхождение


AlexWlad   (2007-06-18 19:38:00) [3]

Весьма медленное решение (LIKE и тем более OR). Я бы завел дополнительное числовоеполе для номера счета (заполняется триггером), а дальше использовал конструкцию WHERE <field_name> IN (...,...,...). Быстрее не то, что в разы, в сотни раз.


sniknik   (2007-06-18 17:57:00) [4]

> 20,21,23,29,30,36,44.
SELECT * FROM <table_name> WHERE
(<field_name> LIKE '2[0139].%') OR
(<field_name> LIKE '3[06].%') OR
(<field_name> LIKE '44.%')


mefodiy   (2007-06-18 17:28:00) [5]

Дело в том, что первая и вторая цифры счетов могут быть разные. Может быть, например, такой набор счетов:
20,21,23,29,30,36,44.
База данных MSSQL и
SELECT * FROM <table_name> WHERE
<field_name>  LIKE '1[056].%'
здесь работает.


sniknik   (2007-06-18 14:58:00) [6]

> если эта база умеет работать с regexp
> то можно примерно так:
для mssql так
SELECT * FROM <table_name> WHERE
<field_name>  LIKE '1[056].%'


mysql   (2007-06-18 14:06:00) [7]

только вот с кириллицей непонятки если использовать regexp,
попробуй, впрочем если поле только числовое, то думаю проблем не будет


mysql   (2007-06-18 14:04:00) [8]

если эта база умеет работать с regexp
то можно примерно так:
SELECT * FROM <table_name> WHERE
(<field_name> REGEXP '^1[056]\\\.*')


Johnmen   (2007-06-18 13:28:00) [9]


> Можно ли написать более компактный код?

Нет.


mefodiy   (2007-06-18 13:02:00) [10]

В том то и дело, что другие есть, и '1_.%' не подходит.


Desdechado   (2007-06-18 12:13:00) [11]

mefodiy   (18.06.07 12:07) [3]
Если в первом десятке других нет, то '1_.%'


mefodiy   (2007-06-18 12:10:00) [12]

>Reindeer Moss Eater ©

Что-то типа

(<field_name> LIKE ('шаблон_1') OR
                          ('шаблон_2') OR
..............................................
                          ('шаблон_N')


mefodiy   (2007-06-18 12:07:00) [13]

Уточняю задачу.
Из таблицы надо выбрать определенные номера счетов.
Вот пример:
шаблон_1 = '10.%',
шаблон_2 = '15.%,'
шаблон_3 = '16.%,'


Reindeer Moss Eater   (2007-06-18 12:04:00) [14]

но код как-то не нравится.

чем именно?


Desdechado   (2007-06-18 12:02:00) [15]

Если шаблон универсализовать, то можно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо