我希望能够说:
SELECT * FROM myTable WHERE accountName LIKE('%john%', '%bill%', '%lory%'.....)
我希望它是动态的,这意味着依赖于用户输入'%name%'部分的列表将是不同的。一次可以有3个名字,另一个可能只有1个。
答案 0 :(得分:3)
您可以使用JOIN
:
SELECT DISTINCT myTable.*
FROM myTable
JOIN (SELECT '%john%' UNION ALL
SELECT '%bill%' UNION ALL
SELECT '%lory%') sub(c) -- this could be anything table variable/temp
ON myTable.accountName LIKE sub.c;
请记住,'%...%'不具备SARG功能。
使用表变量:
DECLARE @tab AS TABLE (c NVARCHAR(100));
INSERT INTO @tab(c) VALUES ('...');
-- ...
SELECT DISTINCT myTable.*
FROM myTable
JOIN @tab t
ON myTable.accountName LIKE t.c;
答案 1 :(得分:2)
WHERE accountName LIKE('%john%','%bill%','%lory%'.....)
这是无效的语法,不起作用。做你想做的最简单的方法就是使用像Jeff Moden's DelimitedSplit8K这样的“字符串拆分器”功能
DECLARE @Names VARCHAR(1000) = 'john, bill, lory';
SELECT
*
FROM
dbo.myTable mt
CROSS APPLY dbo.DelimitedSplit8K(@Names, ',') dsk
WHERE
mt.accountname LIKE '%' + dsk.Item + '%';
OR
SELECT
*
FROM
dbo.myTable mt
WHERE
EXISTS (
SELECT 1
FROM dbo.DelimitedSplit8K(@Names, ',') dsk
WHERE mt.accountname LIKE '%' + dsk.Item + '%'
);
HTH,Jason
答案 2 :(得分:0)
建立Jason和Lad非常出色的解决方案,您可以通过索引视图加快速度。
在继续之前 - 请务必注意,这会降低经常修改这些表的高流量OLTP环境中的插入/更新/删除速度。测试,测试,测试!
我在数据仓库世界工作,这非常好。
首先是常用搜索字词的关键字表:
CREATE TABLE dbo.keyword (kw varchar(100) not null, constraint uq_keyword unique clustered(kw));
INSERT dbo.keyword VALUES ('john'), ('bill'), ('lory');
下一张桌子:
CREATE TABLE dbo.mytable(someid int identity not null, accountname varchar(100));
INSERT dbo.mytable(accountname) VALUES
('John''s Flowers'), ('Candles by Bill'), ('Some other account'), ('The Lory Group LLC');
现在的视图以及几个重要的索引:
CREATE VIEW dbo.vw_mytable_fastKWLookup
WITH SCHEMABINDING AS -- schemabinding required for indexed views
SELECT
t.someid,
t.accountname,
k.kw
FROM dbo.mytable t
CROSS JOIN dbo.keyword k
WHERE t.accountname LIKE '%'+k.kw+'%';
GO
-- required unique clustered index
CREATE UNIQUE CLUSTERED INDEX uq_cl_vw_mytable_fastKWLookup
ON dbo.vw_mytable_fastKWLookup(kw, someid);
-- A good nonclustered index
CREATE NONCLUSTERED INDEX nc_vw_mytable_fastKWLookup__kw
ON dbo.vw_mytable_fastKWLookup(kw) include (someid, accountname);
您的索引视图到位后,您可以将搜索字词添加到列表中,如下所示:
SELECT someid, accountname, kw
FROM vw_mytable_fastKWLookup WITH (NOEXPAND)
WHERE kw IN ('John', 'Lory', 'Bill', 'Fred');
结果:
someid accountname kw
----------- -------------------- -----
1 John's Flowers john
2 Candles by Bill bill
4 The Lory Group LLC lory
这里的奖励是一个执行计划,它执行非聚集索引搜索%searchstring%样式搜索。