Sql server LIKE运算符用逗号分隔的字符串

时间:2015-03-17 23:40:15

标签: sql-server

我的存储过程接收一个以逗号分隔的字符串参数:

DECLARE  @review_status varchar(200)
SET @review_status='CANCELLED,INSPECTED,REJECTED,UNASSIGNED'

我将此变量用于 LIKE 运算符,当没有逗号的值然后完美但它带有逗号然后无法处理。 现在我使用这个陈述

SELECT * FROM tblReview WHERE 
review_status LIKE '%' + @review_status + '%'

我需要从中发表这个声明

SELECT * FROM tblReview WHERE 
review_status LIKE '%CANCELLED%' OR --Pass @review_status
review_status LIKE '%INSPECTED%' OR 
review_status LIKE '%REJECTED%'.....

这样做的最佳做法是什么?

3 个答案:

答案 0 :(得分:2)

您可以使用字符串拆分器来执行此操作。阅读此article,了解其中一个最快的分割器。

然后您需要使用IN运算符进行过滤:

SELECT * 
FROM tblReview 
WHERE review_status IN(
    SELECT item FROM dbo.DelimitedSplit8K(@review_status,',')
)

由于您使用的是LIKE,因此您可能希望JOIN代替IN

SELECT *
FROM tblReview t
INNER JOIN dbo.DelimitedSplit8K(@review_status, ',') s
    ON t.review_status LIKE '%' + s.Item + '%'

答案 1 :(得分:0)

尝试首先使用逗号将varchar转换为表格,如http://blogs.msdn.com/b/amitjet/archive/2009/12/11/sql-server-comma-separated-string-to-table.aspx所述。然后,使用以下内容:

CREATE TABLE #allPattern (
  pattern NVARCHAR(max)
);

INSERT INTO #allPattern VALUES ('%CANCELLED%'), ('%INSPECTED%'), ('%REJECTED%');

SELECT t.* FROM tblReview t JOIN #allPattern a ON (t.review_status LIKE a.pattern);

答案 2 :(得分:0)

您可以将前导和尾随逗号添加到您的字符串中,然后使用CHARINDEX()

SET @review_status=',CANCELLED,INSPECTED,REJECTED,UNASSIGNED,'
SELECT * FROM tblReview WHERE 
charindex(','+review_status+',', '@review_status') >0

字符串开头和结尾处的逗号用于进行精确的字符串查找 - 例如,如果你有两种状态 - 一种叫做CAN而另一种叫做CANCELED,没有旁边逗号的charindex会发现它们都是

这是最简单的方式,但不是性能最佳的方式,所以不要在长CSV上使用它。