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