【问题标题】:Sql server LIKE Operator with comma separated string带有逗号分隔字符串的 SQL 服务器 LIKE 运算符
【发布时间】:2023-04-03 12:45:01
【问题描述】:

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

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%'.....

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

【问题讨论】:

  • 严格来说,我想说最好的做法是使用表值参数而不是标量。任何时候你打破第一范式,你都可能没有遵循最佳实践。

标签: sql-server


【解决方案1】:

您可以使用字符串拆分器来执行此操作。阅读此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 + '%'

【讨论】:

    【解决方案2】:

    尝试首先将带逗号的 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);
    

    【讨论】:

      【解决方案3】:

      您可以在字符串中添加前后逗号,然后使用CHARINDEX()

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

      字符串开头和结尾的逗号用于使精确的字符串查找成为可能-例如,如果您有两种状态-一种称为CAN,第二种称为CANCELLED,不带逗号的charindex会同时找到它们.

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        相关资源
        最近更新 更多