在like运算符中选择多个值

时间:2018-07-20 05:15:48

标签: sql sql-server

我有SW_TBL_KEYWORD

Keyword       
-------
 ATOP
 APMT
 RSND

这是我的测试查询

DECLARE @string NVARCHAR(MAX)
SELECT @string = 'ATOP,APMT'  

SELECT * 
FROM SW_TBL_KEYWORD 
WHERE Keyword LIKE @string 

所以我需要将来自后端的多个值传递给like运算符。测试查询不起作用。

帮助!!!

3 个答案:

答案 0 :(得分:0)

您尝试使用它的方式仅适用于Mysql的“ IN”功能!

这意味着您必须这样做

select * from SW_TBL_KEYWORD where Keyword like "ATOP" OR Keyword LIKE "APMT"..

也要提及,例如,您可以在此之前,之后或之前和之后使用%

select * from SW_TBL_KEYWORD where Keyword like "%TO%" 

还将为您提供结果“ ATOP”。

因此,如果您要搜索一个以上的单词,则必须根据单词的数量来构建查询!

我不知道您如何获得搜索词,但是如果您将其与“”分开,则可以将其分解,然后对其进行扫盲并创建查询!

答案 1 :(得分:0)

您是否将like @string替换为REGXP REPLACE(@string, ",", "|")以实现您想要的

select * from SW_TBL_KEYWORD where Keyword REGXP REPLACE(@string, ",", "|")

答案 2 :(得分:0)

请尝试以下:永久和灵活的解决方案

创建函数Split来满足此要求并将来使用

CREATE FUNCTION dbo.Split(@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT pn,
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
    FROM Pieces
  )

您的表格和值

DECLARE @SW_TBL_KEYWORD TABLE(Keyword VARCHAR(500))
INSERT INTO @SW_TBL_KEYWORD VALUES
('ATOP'),
('APMT'),
('RSND')

满足您需求的逻辑

DECLARE @string VARCHAR(MAX)
SELECT @string='ATOP,APMT' 

使用您创建的函数将逗号分隔的值分割并存储在表变量或临时表中

DECLARE @tmp_filter TABLE(keyword VARCHAR(500))
INSERT INTO @tmp_filter
SELECT s FROM dbo.Split(',', @string)

使用Like将过滤器表与实际表结合起来,但是看到过滤器和实际值后,我认为您希望完全匹配,而不是使用like

SELECT t1.*
FROM @SW_TBL_KEYWORD t1 
INNER JOIN @tmp_filter t2 ON t1.Keyword LIKE ('%' + t2.keyword + '%')

对于完全匹配,我们可以使用下面的行更改连接

INNER JOIN @tmp_filter t2 ON t1.Keyword = t2.keyword

注意:这是长期解决方案,对其他类似任务很有用。如果您使用的是SQLSERVER2016 or newest,则可以使用STRING_SPLIT函数而不是创建用户定义的函数。