Есть ли способ объединить IN с LIKE в операторе SQL? - PullRequest
7 голосов
/ 04 марта 2009

Я пытаюсь найти способ, если возможно, использовать IN и LIKE вместе. Я хочу выполнить подзапрос, который выводит список данных в оператор IN. Проблема в том, что список данных содержит подстановочные знаки. Есть какой-либо способ сделать это?

Просто то, что мне было интересно.

Example of data in the 2 tables

Parent table

ID    Office_Code   Employee_Name
1     GG234         Tom
2     GG654         Bill
3     PQ123         Chris

Second table

ID    Code_Wildcard
1     GG%
2     PQ%

Пояснительная записка (от стороннего производителя)

Поскольку я вижу несколько ответов, которые, кажется, не соответствуют тому, что спрашивает Зилтоид, я подумал, что пытаюсь уточнить, что я думаю, он имеет в виду.

В SQL "WHERE col IN (1,2,3)" примерно эквивалентно "WHERE col = 1 OR col = 2 OR col = 3".

Он ищет что-то, что я псевдокод, как

 WHERE col IN_LIKE ('A%', 'TH%E', '%C')

что было бы примерно эквивалентно

 WHERE col LIKE 'A%' OR col LIKE 'TH%E' OR col LIKE '%C'

Ответы на регулярные выражения, кажется, ближе всего; остальные, кажется, далеко от цели.

Ответы [ 9 ]

8 голосов
/ 04 марта 2009

Я не уверен, какую базу данных вы используете, но с Oracle вы могли бы сделать что-то эквивалентное, создав псевдоним своего подзапроса в предложении FROM вместо использования его в предложении IN. Используя ваш пример:

select p.*
from
  (select code_wildcard
   from second
   where id = 1) s
  join parent p
      on p.office_code like s.code_wildcard
6 голосов
/ 04 марта 2009

В MySQL, используйте REGEXP:

WHERE field1 REGEXP('(value1)|(value2)|(value3)')

То же самое в Oracle:

WHERE REGEXP_LIKE(field1, '(value1)|(value2)|(value3)')
3 голосов
/ 04 марта 2009

Вы имеете в виду что-то вроде:

select * FROM table where column IN (
   SELECT column from table where column like '%%'
)

На самом деле это должно быть написано так:

SELECT * FROM table where column like '%%'

Использование запроса на дополнительный выбор действительно полезно, когда вам нужно получить записи, основанные на наборе логики, который вам не нужен в основном запросе.

что-то вроде:

SELECT * FROM TableA WHERE TableA_IdColumn IN 
(
     SELECT TableA_IdColumn FROM TableB WHERE TableA_IDColumn like '%%'
)

обновить до вопроса:

Вы не можете объединить оператор IN с оператором like:

Для поиска по различным групповым символам вам нужно будет сделать три разных похожих предложения.

2 голосов
/ 04 марта 2009

Может, как-то так?

SELECT DISTINCT
     my_column
FROM
     My_Table T
INNER JOIN My_List_Of_Value V ON
     T.my_column LIKE '%' + V.search_value + '%'

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

2 голосов
/ 04 марта 2009

Вы можете использовать оператор LIKE для получения списка идентификаторов, а затем использовать его в операторе IN.

Но вы не можете напрямую объединить IN и LIKE.

1 голос
/ 05 марта 2009
select *
  from parent
 where exists( select *
                 from second
                where office_code like trim( code_wildcard ) );

Обрезать code_wildcard на тот случай, если в ней есть конечные пробелы.

0 голосов
/ 04 марта 2009

Если я правильно читаю вопрос, мы хотим, чтобы все родительские строки имели код Office_code, который совпадает с любой картой Code_Wildcard во второй таблице.

В Oracle, по крайней мере, этот запрос достигает:

SELECT * 
FROM parent, second 
WHERE office_code LIKE code_wildcard;

Я что-то упустил?

0 голосов
/ 04 марта 2009

tsql имеет оператор содержит для таблицы с полным полнотекстовым поиском.

CONTAINS(Description, '"sea*" OR "bread*"')
0 голосов
/ 04 марта 2009

Возможно, вы могли бы выполнить роль Like в подзапросе?

Выбрать * Из таблицы A, где X in (Выбрать A из таблицыB, где B Как '% 123%')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...