SQL多CASE语句将varchar转float时结果全为Null如何解决
问题根因
你的转换逻辑全部返回null是两个问题叠加导致的:
- CASE判断没有覆盖字符串值
'Null'的场景,这类值走到CAST逻辑时本身就无法转为数值 - 样例中看起来带千分位间隔的数值(比如
'5 554 548'),数字之间的间隔不是普通半角空格,是Unicode窄不间断空格(字符编码U+202F,对应SQL里的NCHAR(8239)),SQL的TRY_CAST无法识别夹带这类特殊字符的字符串为合法数值,会直接返回null,这是所有有效值转换失败的核心原因。
修复后的查询代码
你只需要补全无效值的判断逻辑,同时提前把数值字符串里的特殊分隔空格替换为空,再做类型转换即可:
SELECT col1, CASE WHEN col1 IN ('#DIV/0!', '#N/A', 'Null') THEN NULL ELSE TRY_CAST(REPLACE(col1, NCHAR(8239), '') AS FLOAT) END AS col2 FROM test
如果你的数据里还存在用普通半角空格做千分位分隔的情况,可以把替换逻辑做下兼容,避免同类转换失败:
SELECT col1, CASE WHEN col1 IN ('#DIV/0!', '#N/A', 'Null') THEN NULL ELSE TRY_CAST(REPLACE(REPLACE(col1, NCHAR(8239), ''), ' ', '') AS FLOAT) END AS col2 FROM test
执行效果
执行修复后的代码,返回结果符合预期:
'#DIV/0!'、'#N/A'、'Null'三类无效值的转换结果为null'5 554 548'正确转换为浮点值5554548'-230 896'正确转换为浮点值-230896
内容的提问来源于stack exchange,提问作者user15915737
相关产品推荐
相关产品推荐

