Поле SQL SELECT WHERE содержит слова

Мне нужен выбор, который бы возвращал результаты следующим образом:

SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 word2 word3'

И мне нужны все результаты, т.е. это включает в себя строки с "word2 word3 word1" или "word1 word3 word2" или любую другую комбинацию из трех.

В результате должны быть все слова.

Ответ 1

Довольно медленный, но рабочий метод включает любой слова:

SELECT * FROM mytable
WHERE column1 LIKE '%word1%'
   OR column1 LIKE '%word2%'
   OR column1 LIKE '%word3%'

Если вам нужны слова all, используйте:

SELECT * FROM mytable
WHERE column1 LIKE '%word1%'
  AND column1 LIKE '%word2%'
  AND column1 LIKE '%word3%'

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

Ответ 2

Обратите внимание: если вы используете LIKE, чтобы определить, является ли строка подстрокой другой строки, вы должны избегать символов, соответствующих шаблону, в строке поиска.

Если ваш диалект SQL поддерживает CHARINDEX, его гораздо проще использовать:

SELECT * FROM MyTable
WHERE CHARINDEX('word1', Column1) > 0
  AND CHARINDEX('word2', Column1) > 0
  AND CHARINDEX('word3', Column1) > 0

Кроме того, имейте в виду, что это и метод в принятом ответе охватывают только подстроку, а не сопоставление слов. Так, например, строка 'word1word2word3' будет по-прежнему соответствовать.

Ответ 3

Функция

 CREATE FUNCTION [dbo].[fnSplit] ( @sep CHAR(1), @str VARCHAR(512) )
 RETURNS TABLE AS
 RETURN (
           WITH Pieces(pn, start, stop) AS (
           SELECT 1, 1, CHARINDEX(@sep, @str)
           UNION ALL
           SELECT pn + 1, stop + 1, CHARINDEX(@sep, @str, stop + 1)
           FROM Pieces
           WHERE stop > 0
      )

      SELECT
           pn AS Id,
           SUBSTRING(@str, start, CASE WHEN stop > 0 THEN stop - start ELSE 512 END) AS Data
      FROM
           Pieces
 )

Query

 DECLARE @FilterTable TABLE (Data VARCHAR(512))

 INSERT INTO @FilterTable (Data)
 SELECT DISTINCT S.Data
 FROM fnSplit(' ', 'word1 word2 word3') S -- Contains words

 SELECT DISTINCT
      T.*
 FROM
      MyTable T
      INNER JOIN @FilterTable F1 ON T.Column1 LIKE '%' + F1.Data + '%'
      LEFT JOIN @FilterTable F2 ON T.Column1 NOT LIKE '%' + F2.Data + '%'
 WHERE
      F2.Data IS NULL

Ответ 4

SELECT * FROM MyTable WHERE 
Column1 LIKE '%word1%'
AND Column1 LIKE '%word2%'
AND Column1 LIKE  '%word3%'

Изменен OR на AND на основе редактирования вопроса.

Ответ 5

Вместо SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 word2 word3', добавьте И между этими словами, как:

SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 And word2 And word3'

для получения дополнительной информации, см. здесь https://msdn.microsoft.com/en-us/library/ms187787.aspx

Ответ 6

Если вы просто хотите найти совпадение.

SELECT * FROM MyTable WHERE INSTR('word1 word2 word3',Column1)<>0

SQL Server:

CHARINDEX(Column1, 'word1 word2 word3', 1)<>0

Получить точное соответствие. Пример (';a;ab;ac;',';b;') не будет соответствовать.

SELECT * FROM MyTable WHERE INSTR(';word1;word2;word3;',';'||Column1||';')<>0

Ответ 7

Если вы используете Oracle Database, вы можете достичь этого, используя содержит запрос. Содержит запросы быстрее, чем запрос.

Если вам нужны все слова

SELECT * FROM MyTable WHERE CONTAINS(Column1,'word1 and word2 and word3', 1) > 0

Если вам нужно какое-либо из слов

SELECT * FROM MyTable WHERE CONTAINS(Column1,'word1 or word2 or word3', 1) > 0

Содержит индекс потребности CONTEXT в столбце.

CREATE INDEX SEARCH_IDX ON MyTable(Column) INDEXTYPE IS CTXSYS.CONTEXT

Ответ 8

почему бы не использовать "in" вместо?

Select *
from table
where columnname in (word1, word2, word3)

Ответ 9

select * from table where name regexp '^word[1-3]$'

или

select * from table where name in ('word1','word2','word3')

Ответ 10

SELECT * FROM MyTable WHERE Column1 Like "*word*"

Это отобразит все записи, в которых column1 имеет частичное значение, содержащее word.

Ответ 11

попробуйте использовать "поиск tesarus" в текстовом индексе в MS SQL Server. Это намного лучше, чем использование "%" в поиске, если у вас есть миллионы записей. У tesarus небольшое потребление памяти, чем у других. попробуйте выполнить поиск по этим функциям:)

Ответ 12

лучший способ - сделать полнотекстовый индекс в столбце таблицы и используйте вместо LIKE

SELECT * FROM MyTable WHERE 
contains(Column1 , N'word1' )
AND contains(Column1 , N'word2' )
AND contains(Column1 , N'word3' )