Можно ли как то использовать like и in вместе в SQL запросе?


(Mykhailo Poliarush) #1

мне надо сделать поиск по нескольким совпадениям
select * from table_a where data like '%abc1%' or data like '%abc2%' or data like '%abc2%' 

хочется как-то сделать удобнее
select * from table_a where data like in  ('%abc%' , '%abc%' , '%abc%' )

может кто сталкивался с подобной задачей?


(Дмитрий Жарий) #2

Может быть регекспом вместо like?


(apetrovskiy) #3

Странная кверя :) если надо собрать три совпадения по И, то почему не сделать '%abc1%abc2%abc3%'?

Другое дело ИЛИ - если надо брать строки или с '%abc1%', или с '%abc2%', ...

сейчас под рукой только айпад, БД тут у меня нет, проверить не могу - должно быть что-то вроде:

select * from table_a t1 where table_a.data in (select t1.data from t1...)

в понимании стандартного SQL, список - это запрос.

Стандартный сиквел понимает подзапрос из одной или нескольких таблиц, а вот конкретные реализации могут вытащить откуда угодно: временная таблица, созданная на лету, хранимая процедура, внешняя функция, датасет (МС сиквел), линq и т. д.

(боже, как достал этот хром! Перестает вводить символы, до тех пор, пока не походишь по полям. А чтобы его по-настоящему закрыть, надо закрыть _каждую_ из десятков табов!)


(Mykhailo Poliarush) #4

я уже думал на этим.

у меня Оракл база, там есть такая штука как REGEXP_LIKE, но она доступна в PL/SQL, а у меня возможность использовать только SQL

http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm


(Mykhailo Poliarush) #5

сорри, я не верно указал SQL, там должен быть OR (уже поправил оригинальный запрос)

а можно приложить полный какой-то пример, так лучше понимается.


(apetrovskiy) #6

 


Наверное, я тут предложил пульнуть из пушки по воробьям. smile первая половина поста о теории.

Надо сказать, что такие подзапросы нужны, прежде всего, для разбиения запроса на мелкие куски. Например (просто от балды) в столбце data строки, а в столбце price цена, которая может совпасть с красной ценой дисконта, а в столбце customers выборка по customerid (а даны имена), тогда делаем что-то вроде:


Select table_a.data from table_a t1 where table_a.data in (select t1.data from t1, discounts where discounts.rednumber = t1.price)

and

table_a.data in (select t1.customerid from t1, customers where t1.customerid = customers.customerid and customers.name like '%jo_n%)

 

=====================

Порывшись в инете на предмет оператора with,  неожиданно наткнулся - можно же создать вьюху в памяти, это должно поддерживаться, а потом пробежаться по ней курсором (если фраз сотня, это определенно будет иметь смысл):

http://www.simple-talk.com/sql/performance/the-except-and-intersect-operators-in-sql-server/


 

Create view list1 as

Select '%abc1%' as item

Union select '%abc2%';

 

Затем созидайте курсор по этой вьюхе.

Дальше, зависит от реализации, курсор должен выдавать поисковые строки в переменную, кверя вида select table_a.data from table_a where table_a.data like переменная.

В курсоре можно на копить результаты в постоянную, временную или виртуальную таблицу, заинсертив, сложив по юнион или вычтя не уникальные, и готово!

 

К сожалению, затестить пример не могу.


 


(Mykhailo Poliarush) #7

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