我需要一个选择,它将返回如下结果:

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

我需要所有的结果,即这包括字符串'word2 word3 word1'或'word1 word3 word2'或任何其他组合的三个。

结果中必须包含所有的单词。


当前回答

最好的方法是在表中的列上创建全文索引 用contains代替LIKE

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

其他回答

尝试在SQL Server的全文索引中使用“Tesarus搜索”。如果您有数百万条记录,这比在搜索中使用“%”要好得多。Tesarus的内存消耗比其他的小。

尝试搜索这个函数:)

实现问题中提到的最简单的方法之一是使用CONTAINS和NEAR或'~'。例如,下面的查询将为我们提供具体包括word1、word2和word3的所有列。

SELECT * FROM MyTable WHERE CONTAINS(Column1, 'word1 NEAR word2 NEAR word3')

SELECT * FROM MyTable WHERE CONTAINS(Column1, 'word1 ~ word2 ~ word3')

此外,CONTAINSTABLE根据“word1”、“word2”和“word3”的接近度为每个文档返回一个排名。例如,如果一个文档包含这样一句话,“word1是word2和word3”,那么它的排名就会很高,因为这些术语比其他文档中更接近彼此。

我们还可以使用proximity_term来查找单词位于列短语内它们之间的特定距离内的列。

用"in"代替:

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

如果你正在使用Oracle数据库,那么你可以使用包含查询来实现这一点。包含查询比同类查询快。

如果你需要所有的单词

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

相当缓慢,但工作方法包括任何单词:

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

如果你需要所有的单词都出现,使用这个:

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

如果您想要更快,您需要研究全文搜索,这对于每种数据库类型都是非常特定的。