【问题标题】:How to use like clause over string separated with comma inside case statement如何在case语句中使用逗号分隔字符串的like子句
【发布时间】:2021-10-22 08:04:15
【问题描述】:
DECLARE @IsSearch_  BIT;
SET @IsSearch_ ='True'
DECLARE @Organization_  VARCHAR(100);
SET @Organization_ ='111,111A'

select *
from VYC20 C20
where (@Organization_ IS NULL) 
  OR (1 = CASE @IsSearch_
          WHEN 0 THEN (CASE WHEN @Organization_ IS NOT NULL
                            AND C20.ORG IN 
                                (select value
                                from STRING_SPLIT(@Organization_, ','))
                            THEN 1 ELSE 0 END)
          WHEN 1 THEN (CASE WHEN C20.ORG like @Organization_ + '%'
                             THEN 1 ELSE 0 END)
          ELSE 0 END)

在上面的查询中,第一种情况 WHEN 0 带有 IN 子句的语句给出了正确的记录,但是 WHEN 1 THEN 给了我 0 条记录,有人可以帮助我如何应用带有逗号分隔的字符串的 like 子句。

【问题讨论】:

  • minimal reproducible example 在询问 SQL 问题时是一个很好的开始。
  • 在 WHERE 子句中使用 AND/OR 结构而不是 case 表达式通常会更好。
  • 尝试发布一些带有示例和预期输出的示例数据
  • 我可以使用以下查询获取记录:select * from VYC20 C20 INNER JOIN STRING_SPLIT(@Organization_, ',') s ON C20.ORG LIKE s.value + '%' 但我正在努力在案例声明中做同样的事情。
  • @Organization_ + '%' 表示它必须以该值开头

标签: sql sql-server tsql


【解决方案1】:

看起来你真正想要的是使用LIKE after 拆分

DECLARE @IsSearch_  BIT = 1;
DECLARE @Organization_ VARCHAR(100) = '111,111A';

SELECT *
FROM VYC20 C20
WHERE @Organization_ IS NULL
   OR (@IsSearch_ = 0 AND
      C20.ORG IN 
          (SELECT s.value
          FROM STRING_SPLIT(@Organization_, ',') s))
   OR (@IsSearch_ = 1 AND
      EXISTS (SELECT 1
          FROM STRING_SPLIT(@Organization_, ',') s
          WHERE C20.ORG LIKE s.value + '%'));

强烈建议您以基于集合的方式执行此操作并使用表变量或表参数

DECLARE @IsSearch_  BIT = 1;
DECLARE @Organization_ TABLE (value VARCHAR(100));
INSERT @Organization_ VALUES('111'),('111A');

SELECT *
FROM VYC20 C20
WHERE @IsSearch_ = -1  -- include all
   OR (@IsSearch_ = 0 AND
      C20.ORG IN 
          (SELECT s.value
          FROM @Organization_ s))
   OR (@IsSearch_ = 1 AND
      EXISTS (SELECT 1
          FROM @Organization_ s
          WHERE C20.ORG LIKE s.value + '%'));

【讨论】:

  • 在我的查询中,我将WHEN 1 THEN (CASE WHEN C20.ORG like @Organization_ + '%' THEN 1 ELSE 0 END) 替换为WHEN 1 THEN (CASE WHEN EXISTS (SELECT 1 FROM STRING_SPLIT(@Organization_, ',') s WHERE C20.ORG LIKE s.value + '%') THEN 1 ELSE 0 END)。在我看来,它给出了正确的结果。对吗?
  • 是的,但为什么要使用CASE?只需使用普通的AND/OR 逻辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多