我可以一起使用动态LIKE和IN吗?

时间:2017-08-21 16:55:13

标签: sql-server tsql

我希望能够说:

SELECT * FROM myTable WHERE accountName LIKE('%john%', '%bill%', '%lory%'.....) 

我希望它是动态的,这意味着依赖于用户输入'%name%'部分的列表将是不同的。一次可以有3个名字,另一个可能只有1个。

3 个答案:

答案 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%样式搜索。

enter image description here

相关问题