Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何最小化sql选择?_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

如何最小化sql选择?

如何最小化sql选择?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一系列这样的词: $word1 = array('test1','test2','test3','test4','test5',...,'test20'); 我需要在我的表中搜索文本列中至少有一个单词的每一行。到目前为止,我有一个sql查询: SELECT * FROM TABLE WHERE text LIKE '$word1[0]' OR text LIKE '$word1[1]' OR ... OR text LIKE '$word1[20]' 但我发现这种设计效率不高。有没有办

我有一系列这样的词:

$word1 = array('test1','test2','test3','test4','test5',...,'test20');
我需要在我的表中搜索文本列中至少有一个单词的每一行。到目前为止,我有一个sql查询:

SELECT * FROM TABLE WHERE text LIKE '$word1[0]' OR text LIKE '$word1[1]' 
OR ... OR text LIKE '$word1[20]'
但我发现这种设计效率不高。有没有办法缩短这个查询,这样我就不需要写出where子句中的每个单词了

示例从表格中选择*,其中文本为$word1


备注:这是我正在寻找的一个示例,不是我可以运行的实际查询。

一个解决方案可以是:

在数据库中创建一个表,在名为“word by example”的列中使用搜索到的单词-如果需要,可以使用通配符 使用这种请求

选择* 从表,筛选表 WHERE TABLE.text,如FILTER\u TABLE.word


您可以使用如下选择,而无需声明数组:

SELECT * FROM TABLE WHERE text IN ('test1', 'test2', 'test3', 'test4', 'test5')

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

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);

虽然我目前无法访问SQLServer2008,而且SQLFIDLE似乎有问题,但您似乎可以使用a来简化表达式

从测试中选择* 从值'word1'、'word2'、'word3'、'word4'中选择w作为aw a 在test.text上,如“%”+a.w+'%”; …将在测试表的文本列中搜索列为值的单词。如果您不希望多个单词匹配的行出现重复,您可以只在select中添加一个DISTINCT


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

实际上,你想要的是你已经写过的东西。从$word1中文本所在的表格中选择*。似乎学习者希望在仅搜索完全相等时使用LIKE而不是equal比较器。似乎学习者希望在仅搜索完全相等时使用LIKE而不是equal比较器。在他的选择中,他没有使用任何通配符,所以我认为使用IN可以。以这种方式使用LIKE可以使用索引,然而,正如您所说,它仍然很昂贵,使用索引并不一定有利。这就是为什么我会选择EXISTS over JOIN,它被优化为反半联接,即在找到单个匹配项后停止搜索,并且由于LIKE上的联接可能使用嵌套循环联接,因此会导致更低的IO和更少的循环。