我的存储过程接收一个以逗号分隔的字符串参数:
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%'.....
这样做的最佳做法是什么?
答案 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上使用它。