我需要一个select会返回如下结果:
SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 word2 word3'
Run Code Online (Sandbox Code Playgroud)
我需要所有结果,即这包括带有'word2 word3 word1'或'word1 word3 word2'的字符串或三者的任何其他组合.
所有单词都需要在结果中.
mvp*_*mvp 740
相当慢,但工作方法包括任何单词:
SELECT * FROM mytable
WHERE column1 LIKE '%word1%'
OR column1 LIKE '%word2%'
OR column1 LIKE '%word3%'
Run Code Online (Sandbox Code Playgroud)
如果您需要出现所有单词,请使用:
SELECT * FROM mytable
WHERE column1 LIKE '%word1%'
AND column1 LIKE '%word2%'
AND column1 LIKE '%word3%'
Run Code Online (Sandbox Code Playgroud)
如果你想要更快的东西,你需要查看全文搜索,这对每种数据库类型都是非常具体的.
Sam*_*Sam 70
请注意,如果您用于LIKE确定字符串是否是另一个字符串的子字符串,则必须转义搜索字符串中的模式匹配字符.
如果您的SQL方言支持CHARINDEX,则使用它会更容易:
SELECT * FROM MyTable
WHERE CHARINDEX('word1', Column1) > 0
AND CHARINDEX('word2', Column1) > 0
AND CHARINDEX('word3', Column1) > 0
Run Code Online (Sandbox Code Playgroud)
此外,请记住,这和接受的答案中的方法仅涵盖子字符串匹配而不是字匹配.因此,例如,字符串'word1word2word3'仍然匹配.
Edu*_*omo 18
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
)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
mes*_*-up 12
而不是SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 word2 word3',在这些词之间添加和:
SELECT * FROM MyTable WHERE Column1 CONTAINS 'word1 And word2 And word3'
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅此处 https://msdn.microsoft.com/en-us/library/ms187787.aspx
UPDATE
要选择短语,请使用双引号,如:
SELECT * FROM MyTable WHERE Column1 CONTAINS '"Phrase one" And word2 And "Phrase Two"'
Run Code Online (Sandbox Code Playgroud)
ps在使用contains关键字之前,您必须首先在表上启用全文搜索.有关详细信息,请参阅此处 https://docs.microsoft.com/en-us/sql/relational-databases/search/get-started-with-full-text-search
SELECT * FROM MyTable WHERE
Column1 LIKE '%word1%'
AND Column1 LIKE '%word2%'
AND Column1 LIKE '%word3%'
Run Code Online (Sandbox Code Playgroud)
更改OR为AND基于编辑问题.
如果您使用的是Oracle数据库,则可以使用包含查询来实现此目的.包含查询比查询更快.
如果你需要所有的话
SELECT * FROM MyTable WHERE CONTAINS(Column1,'word1 and word2 and word3', 1) > 0
Run Code Online (Sandbox Code Playgroud)
如果你需要任何一个词
SELECT * FROM MyTable WHERE CONTAINS(Column1,'word1 or word2 or word3', 1) > 0
Run Code Online (Sandbox Code Playgroud)
包含列上CONTEXT类型的需要索引.
CREATE INDEX SEARCH_IDX ON MyTable(Column) INDEXTYPE IS CTXSYS.CONTEXT
Run Code Online (Sandbox Code Playgroud)
小智 5
如果你只是想找到一个匹配。
SELECT * FROM MyTable WHERE INSTR('word1 word2 word3',Column1)<>0
Run Code Online (Sandbox Code Playgroud)
SQL 服务器:
CHARINDEX(Column1, 'word1 word2 word3', 1)<>0
Run Code Online (Sandbox Code Playgroud)
获得精确匹配。示例(';a;ab;ac;',';b;')不会得到匹配。
SELECT * FROM MyTable WHERE INSTR(';word1;word2;word3;',';'||Column1||';')<>0
Run Code Online (Sandbox Code Playgroud)
实现问题中提到的最简单的方法之一是将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')
Run Code Online (Sandbox Code Playgroud)
此外,CONTAINSTABLE 根据“word1”、“word2”和“word3”的接近程度返回每个文档的排名。例如,如果文档包含句子“The word1 is word2 and word3”,则其排名会很高,因为这些术语比其他文档中的术语彼此更接近。
我们还可以使用proximity_term来查找单词在列短语内的特定距离内的列。
| 归档时间: |
|
| 查看次数: |
1705513 次 |
| 最近记录: |