0

我有一系列像这样的单词:

$word1 = array('test1','test2','test3','test4','test5',...,'test20');

我需要在我的表中搜索列中至少包含这些单词中的一个的每一行text。到目前为止,我有这个 sql 查询:

SELECT * FROM TABLE WHERE text LIKE '$word1[0]' OR text LIKE '$word1[1]' 
OR ... OR text LIKE '$word1[20]'

但我发现这种设计效率不高。有什么办法可以缩短这个查询,这样我就不需要写出 where 子句中的每个单词?

例子SELECT * FROM TABLE WHERE text IN ($word1)

PS:这是我正在寻找的示例,而不是我可以运行的实际查询。

4

4 回答 4

2

如果您使用表变量而不是列表来存储单词,那么您可以使用以下内容:

DECLARE @T TABLE (Word VARCHAR(255) NOT NULL);
INSERT @T (Word)
VALUES ('test1'), ('test2'), ('test3'), ('test4'), ('test5'), ('test20');

SELECT  * 
FROM    TABLE t
WHERE   EXISTS
        (   SELECT  1
            FROM    @T
            WHERE   t.Text LIKE '%' + word + '%'
        );

您还可以创建一个表类型来存储它,然后如果需要,您可以将它作为参数传递给存储过程:

CREATE TYPE dbo.StringList (Value VARCHAR(MAX) NOT NULL);
GO
CREATE PROCEDURE dbo.YourProcedures @Words dbo.StringList READONLY
AS
    SELECT  * 
    FROM    TABLE t
    WHERE   EXISTS
            (   SELECT  1
                FROM    @Words w
                WHERE   t.Text LIKE '%' + w.word + '%'
            );
GO
DECLARE @T dbo.StringList;
INSERT @T (Value)
VALUES ('test1'), ('test2'), ('test3'), ('test4'), ('test5'), ('test20');

EXECUTE dbo.YourProcedure @T;

有关这方面的更多信息,请参阅MSDN 上的表值参数


编辑

我可能在您使用时误解了您的要求,LIKE但没有通配符运算符,在这种情况下您可以只使用IN,但是我仍然建议使用表格来存储您的值:

DECLARE @T TABLE (Word VARCHAR(255) NOT NULL);
INSERT @T (Word)
VALUES ('test1'), ('test2'), ('test3'), ('test4'), ('test5'), ('test20');

SELECT  * 
FROM    TABLE t
WHERE   t.Text IN (SELECT Word FROM @T);
于 2013-11-06T11:24:23.903 回答
0

一种解决方案可能是:

  1. 在数据库中创建一个表,在名为 word 的列中创建一个表(通过示例) - 如果需要,可以使用通配符
  2. 使用这种请求

    SELECT * FROM TABLE, FILTER_TABLE WHERE TABLE.text LIKE FILTER_TABLE.word

于 2013-11-06T11:18:31.560 回答
0

您可以使用这样的 SELECT 而不声明数组:

SELECT * FROM TABLE WHERE text IN ('test1', 'test2', 'test3', 'test4', 'test5')
于 2013-11-06T11:18:54.543 回答
0

虽然我目前无法访问 SQL Server 2008 并且 SQLfiddle 看起来很糟糕,但您似乎可以使用表值构造函数来稍微简化表达式;

SELECT * FROM test
JOIN (SELECT w FROM (VALUES('word1'), ('word2'), ('word3'), ('word4')) AS a(w)) a
  ON test.text LIKE '%'+a.w+'%';

...它将在测试表中的文本列中搜索列为值的单词。如果您不希望多个单词匹配的行重复,您只需将 a 添加DISTINCT到选择中即可。

请注意,如果您进行大量搜索,您可能需要查看全文索引LIKE,以这种方式在字符串中查找单词的查询不会使用任何索引,并且很可能会非常慢,除非数据已经在内存中.

于 2013-11-06T11:37:25.677 回答