如何最小化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和更少的循环。