SQL 服务器:具有多个可能条件的案例语句中的模式匹配
SQL Server: Pattern Matching in Case Statements with Multiple Possible Conditions
我正在 SQL 服务器中编写查询,其中我试图根据多个“模糊匹配”条件生成数据指示符。一些示例代码来说明此任务:
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 服务器中可行吗?我也很重视您可能提供的任何其他相关专业知识/见解。提前致谢!
如果我正确理解了问题,您需要修复布尔逻辑 - 将所有 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 服务器中编写查询,其中我试图根据多个“模糊匹配”条件生成数据指示符。一些示例代码来说明此任务:
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 服务器中可行吗?我也很重视您可能提供的任何其他相关专业知识/见解。提前致谢!
如果我正确理解了问题,您需要修复布尔逻辑 - 将所有 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