SQL Server:具有多个可能条件的案例语句中的模式匹配

Posted

技术标签:

【中文标题】SQL Server:具有多个可能条件的案例语句中的模式匹配【英文标题】:SQL Server: Pattern Matching in Case Statements with Multiple Possible Conditions 【发布时间】:2021-12-23 04:22:05 【问题描述】:

我正在 SQL Server 中编写一个查询,其中我试图根据多个“模糊匹配”标准生成一个数据指示器。一些示例代码来说明此任务:

CASE WHEN COLUMN_1 IN ('CRITERIA_A') AND
     COLUMN_2 NOT LIKE '%FUZZY_MATCH_A%' OR
     COLUMN_2 NOT LIKE '%FUZZY_MATCH_B%' OR
     COLUMN_2 NOT LIKE '%FUZZY_MATCH_C%'
     THEN 'Y' ELSE NULL END

但是,当此代码运行时,该标志被分配给所有行,而实际上应该只标记 COLUMN_2 与模式不匹配的行。

我尝试使用括号作为补救措施,如下例所示,但失败了:

CASE WHEN COLUMN_1 IN ('CRITERIA_A') AND
     (COLUMN_2 NOT LIKE '%FUZZY_MATCH_A%' OR
      COLUMN_2 NOT LIKE '%FUZZY_MATCH_B%' OR
      COLUMN_2 NOT LIKE '%FUZZY_MATCH_C%')
     THEN 'Y' ELSE NULL END

我也尝试嵌套 Case 语句,也失败了:

CASE WHEN COLUMN_1 IN ('CRITERIA_A') THEN
     CASE WHEN COLUMN_2 NOT LIKE '%FUZZY_MATCH_A%' OR
          COLUMN_2 NOT LIKE '%FUZZY_MATCH_B%' OR
          COLUMN_2 NOT LIKE '%FUZZY_MATCH_C%'
          THEN 'Y' ELSE NULL END

所以,写得直白,目标是“当 [COLUMN_1] 具有 'X' 值并且 [COLUMN_2] 中的值与此可能模式列表不匹配时,然后为记录分配一个标志 'Y '"。

这在 SQL Server 中可行吗?我也会重视您可能提供的任何其他相关专业知识/见解。提前致以诚挚的感谢!

【问题讨论】:

【参考方案1】:

如果我正确理解了这个问题,您需要修复布尔逻辑 - 将所有 OR 运算符替换为 AND

SELECT 
   CASE 
      WHEN 
         COLUMN_1 IN ('CRITERIA_A') AND 
         COLUMN_2 NOT LIKE '%FUZZY_MATCH_A%' AND
         COLUMN_2 NOT LIKE '%FUZZY_MATCH_B%' AND
         COLUMN_2 NOT LIKE '%FUZZY_MATCH_C%' THEN 'Y' 
      ELSE NULL 
   END
FROM (VALUES
   ('CRITERIA_A', 'FUZZY_MATCH_A'),
   ('CRITERIA_A', 'FUZZY_MATCH_B'),
   ('CRITERIA_A', 'FUZZY_MATCH_C'),
   ('CRITERIA_A', 'FUZZY_MATCH_ABC'),
   ('CRITERIA_A', 'FUZZY_MATCH_D')
) t (COLUMN_1, COLUMN_2)

结果:

(No column name)
----------------
Null
Null
Null
Null
Y

【讨论】:

感谢佐罗夫!这就是问题所在。

以上是关于SQL Server:具有多个可能条件的案例语句中的模式匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何在不同条件的sql server的case语句中插入多个else?

sqlserver删除语句 sqlserver删除语句条件

1 - SQL Server 2008 之 使用SQL语句创建具有约束条件的表

SQL Server 更新语句基于具有多个值的 Select 语句

具有多个或条件的sql server外连接

SQL Server SUM IF 使用具有多个条件的窗口函数