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

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

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

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


当前回答

实现问题中提到的最简单的方法之一是使用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来查找单词位于列短语内它们之间的特定距离内的列。

其他回答

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;

如果你正在使用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 INSTR('word1 word2 word3', Column1)<>0

SQL服务器:

CHARINDEX(Column1, 'word1 word2 word3', 1)<>0

得到精确匹配。例子:(ab;;;交流;,;b)将不会匹配。

SELECT * FROM MyTable WHERE INSTR(';word1;word2;word3;', ';'||Column1||';')<>0

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

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

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

尝试搜索这个函数:)