SQL多列多条件CASE WHEN替换字段值未生效问题排查
以下为简单示例:
需求为:当MeterModelRemoved = 'G4'且MeterManufacturerRemoved = 'KROMSCHRODER'时,将UnitsofMeterRemoved列中的'Imperial'值修改为'Metric'。
已尝试编写如下SQL语句:
SELECT *, CASE WHEN MeterModelRemoved = 'G4' AND MeterManufacturerRemoved = 'KROMSCHRODER' AND UnitsofMeterRemoved = 'Imperial' THEN UnitsofMeterRemoved = 'Metric' END AS MeterModelRemoved FROM CTE_2
执行查询后UnitsofMeterRemoved列的'Imperial'值仍然显示,问题原因和修正方法如下:
问题原因
这段SQL不生效是三个写法错误导致的:
THEN子句逻辑错误:THEN UnitsofMeterRemoved = 'Metric'是布尔判断表达式,SQL执行时只会返回代表真假的0/1或布尔值,不会返回你需要的'Metric'字符串。- 列别名错误:你把CASE语句生成的新列别名设为了
MeterModelRemoved,和你要修改的UnitsofMeterRemoved列完全不相关;加上你用了SELECT *语法,原始的UnitsofMeterRemoved列会被原封不动查询出来,自然还是显示原来的'Imperial'值。 - 缺少
ELSE分支:CASE语句没有定义不满足条件时的返回规则,不符合判断条件的行,对应新列会直接返回NULL,不会保留原有的单位值。
修正方案
根据你的实际需求二选一即可:
仅查询时临时展示修改结果,不改动原表数据
不要用SELECT *,明确列出需要查询的字段,针对UnitsofMeterRemoved字段写正确的CASE逻辑:
SELECT -- 此处替换为你实际需要查询的其他字段,不要直接用* 字段1, 字段2, MeterModelRemoved, MeterManufacturerRemoved, CASE WHEN MeterModelRemoved = 'G4' AND MeterManufacturerRemoved = 'KROMSCHRODER' AND UnitsofMeterRemoved = 'Imperial' THEN 'Metric' ELSE UnitsofMeterRemoved END AS UnitsofMeterRemoved FROM CTE_2
需要永久修改原表中存储的数据
直接用UPDATE语句匹配符合条件的行更新字段即可:
UPDATE CTE_2 SET UnitsofMeterRemoved = 'Metric' WHERE MeterModelRemoved = 'G4' AND MeterManufacturerRemoved = 'KROMSCHRODER' AND UnitsofMeterRemoved = 'Imperial';
内容的提问来源于stack exchange,提问作者Mizanur Choudhury
相关产品推荐
相关产品推荐

