Можно ли использовать WHERE IN вместе с LIKE? - PullRequest
3 голосов
/ 26 ноября 2010

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

SELECT * FROM TABLE WHERE COL1 LIKE '%test_string%'

И, если мне нужно просмотреть много значений, я могу использовать -

SELECT * FROM TABLE WHERE COL1 IN (Select col from AnotherTable)

Но возможно ли использовать оба вместе?То есть запрос не только выполняет WHERE IN, но также выполняет что-то похожее на WHERE LIKE?Запрос, который просто не просматривает набор значений, но выполняет поиск с использованием групповых символов среди набора значений.

Если это не ясно, я могу привести пример.Дай мне знать.Спасибо.

Пример -

Давайте рассмотрим -

AnotherTable -

  id  | Col
------|------
  1   |  one
  2   |  two
  3   |  three

Таблица -

Col   | Col1
------|------
 aa   |  one
 bb   |  two
 cc   |  three
 dd   |  four
 ee   |  one_two
 bb   |  three_two

Теперь, еслиЯ могу использовать

SELECT * FROM TABLE WHERE COL1 IN (Select col from AnotherTable)

Это дает мне -

Col   | Col1
------|------
 aa   |  one
 bb   |  two
 cc   |  three

Но что, если мне нужно -

Col   | Col1
------|------
 aa   |  one
 bb   |  two
 cc   |  three
 ee   |  one_two
 bb   |  three_two

Полагаю, это должно помочь вам понять, что я имею в видуиспользуя WHERE IN и LIKE вместе

Ответы [ 8 ]

4 голосов
/ 26 ноября 2010
SELECT * 
FROM TABLE A
   INNER JOIN AnotherTable B on
     A.COL1 = B.col
WHERE COL1 LIKE '%test_string%'

На основе предоставленного примера кода, попробуйте. В последнем операторе выбора отображаются данные, которые вы запросили.

create table #AnotherTable
(
    ID int IDENTITY(1,1) not null primary key,
    Col varchar(100)
);

INSERT INTO #AnotherTable(col) values('one')
INSERT INTO #AnotherTable(col) values('two')
INSERT INTO #AnotherTable(col) values('three')

create table #Table
(
    Col varchar(100),
    Col1 varchar(100)
);

INSERT INTO #Table(Col,Col1) values('aa','one')
INSERT INTO #Table(Col,Col1) values('bb','two')
INSERT INTO #Table(Col,Col1) values('cc','three')
INSERT INTO #Table(Col,Col1) values('dd','four')
INSERT INTO #Table(Col,Col1) values('ee','one_two')
INSERT INTO #Table(Col,Col1) values('ff','three_two')

SELECT * FROM #AnotherTable
SELECT * FROM #Table

SELECT * FROM #Table WHERE COL1 IN(Select col from #AnotherTable)


SELECT distinct A.*
FROM #Table A
    INNER JOIN  #AnotherTable B on
        A.col1 LIKE '%'+B.Col+'%'

DROP TABLE #Table
DROP TABLE #AnotherTable
1 голос
/ 26 ноября 2010

Если я правильно понял вопрос, вы хотите, чтобы строки из «Таблицы», когда «Table.Col1» был IN, «AnotherTable.Col», и вы также хотите, чтобы строки, когда Col1 IS LIKE «% some_string%».

Если так, то вы хотите что-то вроде:

SELECT 
    t.* 
FROM 
    [Table] t 
LEFT JOIN 
    [AnotherTable] at ON t.Col1 = at.Col 
WHERE (at.Col IS NOT NULL
    OR t.Col1 LIKE '%some_string%')
1 голос
/ 26 ноября 2010

Попробуйте перекрестное соединение, чтобы вы могли сравнить каждую строку в AnotherTable с каждой строкой в ​​таблице:

SELECT DISTINCT t.Col, t.Col1
FROM AnotherTable at
CROSS JOIN Table t 
WHERE t.col1 LIKE ('%' + at.col + '%')

Чтобы это было безопасно, вам нужно экранировать символы подстановки в at.col. Попробуйте этот ответ для этого.

1 голос
/ 26 ноября 2010

Операторы сопоставления с образцом:

  1. IN, против списка значений,
  2. LIKE, против узора,
  3. REGEXP / RLIKE против регулярного выражения (которое включает в себя как символы подстановки, так и альтернативы и, таким образом, наиболее близко к «использованию символов подстановки через набор значений», например, (ab)+a|(ba)+b будет соответствовать Строки aba ... ba или bab ... ab),
  4. FIND_IN_SET, чтобы получить индекс строки в наборе (который представлен в виде строки, разделенной запятыми),
  5. SOUNDS LIKE для сравнения строк в зависимости от их произношения и
  6. MATCH ... AGAINST для полнотекстового соответствия.

Вот и все для сопоставления строк, хотя есть и другие строковые функции .

Например, вы можете попробовать присоединиться к Table.Col1 LIKE CONCAT(AnotherTable.Col, '%'), хотя производительность, вероятно, будет ужасной (при условии, что она работает).

1 голос
/ 26 ноября 2010

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

1 голос
/ 26 ноября 2010

Да.Используйте ключевое слово AND:

SELECT * FROM TABLE WHERE COL1 IN (Select col from AnotherTable) AND COL1 LIKE '%test_string%'

Но в этом случае вам, вероятно, лучше использовать синтаксис JOIN:

SELECT TABLE.* FROM TABLE JOIN AnotherTable on TABLE.COL1 = AnotherTable.col WHERE TABLE.COL1 LIKE '%test_string'
0 голосов
/ 26 ноября 2010

Вы думаете о чем-то вроде EXISTS?

ВЫБРАТЬ * ИЗ ТАБЛИЦЫ t, ГДЕ ЕСТЬ

0 голосов
/ 26 ноября 2010

Как то так?

SELECT * FROM TABLE 
WHERE 
   COL1 IN (Select col from AnotherTable) 
   AND COL1 LIKE '%test_string%'
...