我需要一个选择,它将返回如下结果:
SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 word2 word3'
我需要所有的结果,即这包括字符串'word2 word3 word1'或'word1 word3 word2'或任何其他组合的三个。
结果中必须包含所有的单词。
我需要一个选择,它将返回如下结果:
SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 word2 word3'
我需要所有的结果,即这包括字符串'word2 word3 word1'或'word1 word3 word2'或任何其他组合的三个。
结果中必须包含所有的单词。
当前回答
用"in"代替:
Select *
from table
where columnname in (word1, word2, word3)
其他回答
注意,如果使用LIKE来确定一个字符串是否是另一个字符串的子字符串,则必须转义搜索字符串中的匹配字符的模式。
如果你的SQL方言支持CHARINDEX,那么使用它会更容易:
SELECT * FROM MyTable
WHERE CHARINDEX('word1', Column1) > 0
AND CHARINDEX('word2', Column1) > 0
AND CHARINDEX('word3', Column1) > 0
另外,请记住,这和接受的答案中的方法只涵盖子字符串匹配,而不是单词匹配。因此,例如,字符串'word1word2word3'仍然会匹配。
实现问题中提到的最简单的方法之一是使用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来查找单词位于列短语内它们之间的特定距离内的列。
将SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 word2 word3'替换为在这些单词之间添加And:
SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 And word2 And word3'
详细信息请参见CONTAINS (Transact-SQL)。
在选择短语时,使用双引号:
SELECT * FROM MyTable WHERE Column1 CONTAINS '"Phrase one" And word2 And "Phrase Two"'
附注:在使用contains关键字之前,您必须首先在表上启用全文检索。有关更多详细信息,请参见全文搜索入门。
尝试在SQL Server的全文索引中使用“Tesarus搜索”。如果您有数百万条记录,这比在搜索中使用“%”要好得多。Tesarus的内存消耗比其他的小。
尝试搜索这个函数:)
MySQL:
配套功能
-- Split @str by @sep
-- Returns all parts
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
)
查询示例
在MyTable中搜索单词word1, word2, word3。Column1:
-- Create a temporal table (the Data size depends on the length of the word)
DECLARE @FilterTable TABLE (Data VARCHAR(512))
-- Get different and unique words for the search
INSERT INTO @FilterTable (Data)
SELECT DISTINCT S.Data
FROM fnSplit(' ', 'word1 word2 word3') S -- Contains words
-- Search into "MyTable" by "Column1"
SELECT DISTINCT
T.*
FROM
MyTable T
-- Matching records
INNER JOIN @FilterTable F1 ON T.Column1 LIKE '%' + F1.Data + '%'
-- Is some word not present?
LEFT JOIN @FilterTable F2 ON T.Column1 NOT LIKE '%' + F2.Data + '%'
WHERE
-- Is some word not present?
F2.Data IS NULL;