我有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
运算符。测试查询不起作用。
帮助!!!
答案 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
函数而不是创建用户定义的函数。