SQL SELECT WHERE字段包含单词

我需要一个select,将返回像这样的结果:

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

而且我需要所有的结果,也就是说这个结果包含了“word2 word3 word1”或“word1 word3 word2”的string,或者三者的其他任何组合。

所有的单词都需要在结果中。

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

 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%' 

如果你想要更快的东西,你需要看看全文search,这是非常具体的每种数据库types。

请注意,如果您使用LIKE来确定一个string是否是另一个string的子string,则必须在searchstring中转义匹配字符的模式。

如果你的SQL方言支持CHARINDEX ,那么使用它更容易一些:

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

此外,请记住,这和接受的答案中的方法只包括子string匹配,而不是字匹配。 所以,例如,string'word1word2word3'仍然会匹配。

function

  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 ) 

询问

  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 
 SELECT * FROM MyTable WHERE Column1 LIKE '%word1%' AND Column1 LIKE '%word2%' AND Column1 LIKE '%word3%' 

更改OR为基于编辑问题。

而不是从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

如果你只是想find一个匹配。

 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 

如果你正在使用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 

包含需要列的types为CONTEXT的索引。

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

为什么不使用“in”呢?

 Select * from table where columnname in (word1, word2, word3) 
 select * from table where name regexp '^word[1-3]$' 

要么

 select * from table where name in ('word1','word2','word3') 
 SELECT * FROM MyTable WHERE Column1 Like "*word*" 

这将显示column1有部分值包含word所有logging。

尝试在MS SQL Server的全文索引中使用“tesarussearch”。 如果你有几百万条logging,这比在search中使用“%”要好得多。 tesarus有比其他内存less量的内存消耗。 尝试search这个function:)

最好的方法是在表中的列上创build全文索引,并使用contains来代替LIKE

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