Поле 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' )