Sql server 具有逗号分隔字符串的类似Sql server的运算符
我的存储过程接收一个参数,该参数是逗号分隔的字符串:Sql server 具有逗号分隔字符串的类似Sql server的运算符,sql-server,Sql Server,我的存储过程接收一个参数,该参数是逗号分隔的字符串: DECLARE @review_status varchar(200) SET @review_status='CANCELLED,INSPECTED,REJECTED,UNASSIGNED' 我将此变量与LIKE运算符一起使用,如果值没有逗号,则表示完美,但它带有逗号,则表示无法处理。 现在我使用这个语句 SELECT * FROM tblReview WHERE review_status LIKE '%' + @review_st
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%'.....
执行此操作的最佳实践是什么?您可以使用字符串拆分器来执行此操作。请阅读这篇文章,了解最快的拆分器之一 然后需要使用中的
操作符进行过滤:
SELECT *
FROM tblReview
WHERE review_status IN(
SELECT item FROM dbo.DelimitedSplit8K(@review_status,',')
)
由于您使用的是类似于
的,因此您可能希望执行
加入,而不是中的:
SELECT *
FROM tblReview t
INNER JOIN dbo.DelimitedSplit8K(@review_status, ',') s
ON t.review_status LIKE '%' + s.Item + '%'
尝试首先将带逗号的varchar转换为如下所述的表。然后,使用以下命令:
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);
您可以在字符串中添加前后逗号,然后使用
CHARINDEX()
字符串开头和结尾的逗号用于实现精确的字符串查找-例如,如果您有两种状态-一种称为CAN,另一种称为CANCELLED,charindex不带边逗号将同时查找这两种状态
这是最简单的方法,但不是性能最好的方法,所以不要在长CSV上使用它。严格地说,我认为最佳做法是使用表值参数而不是标量。任何时候,当你打破第一个正常形式,你可能没有遵循最佳实践。
SET @review_status=',CANCELLED,INSPECTED,REJECTED,UNASSIGNED,'
SELECT * FROM tblReview WHERE
charindex(','+review_status+',', '@review_status') >0