嵌套CASE WHEN作为计算列报错,请求技术排查支持
帮你排查SQL CASE WHEN的空值与语法问题
嘿,我来帮你梳理下这段SQL的问题——你的CASE语句结构和语法都有不少小问题,这应该就是空值报错的根源,咱们一步步来修正:
核心问题分析
- CASE结构不完整且逻辑混杂:你把三个独立的CASE逻辑揉在了一起,每个CASE都需要完整的
CASE ... END包裹,而且你试图在同一个SELECT里直接引用刚生成的NEW_DET_NOMINALDR、NEW_DET_NOMINALCR列,SQL里SELECT子句的列是同时计算的,没法互相引用,这会导致解析错误。 - 语法细节错误:你用了中文的单引号
’BS’,得换成英文单引号'BS';另外最后判断NOMINAL的逻辑没有正确的CASE开头,整个语句的END匹配也混乱。
修正后的代码方案(推荐CTE写法,可读性更高)
用CTE先计算出两个中间列,再基于它们生成最终的NOMINAL列,避免重复逻辑,也解决了列引用的问题:
WITH CalculatedColumns AS ( SELECT -- 处理借方金额,生成NEW_DET_NOMINALDR CASE WHEN SUBSTRING(a.DET_NOMINALDR, 3, 2) = 'BS' THEN 0 ELSE a.DET_NOMINALDR END AS NEW_DET_NOMINALDR, -- 处理贷方金额,生成NEW_DET_NOMINALCR CASE WHEN SUBSTRING(a.DET_NOMINALCR, 3, 2) = 'BS' THEN 0 ELSE a.DET_NOMINALCR END AS NEW_DET_NOMINALCR -- 这里可以添加原表中你需要的其他列 FROM your_table_name a -- 记得替换成你的实际表名 ) SELECT NEW_DET_NOMINALDR, NEW_DET_NOMINALCR, -- 基于中间列生成最终的NOMINAL CASE WHEN NEW_DET_NOMINALDR = 0 THEN NEW_DET_NOMINALCR ELSE NEW_DET_NOMINALDR END AS NOMINAL FROM CalculatedColumns;
备选方案(嵌套CASE写法,无需CTE)
如果你的SQL环境不支持CTE,也可以把中间CASE逻辑嵌套到最终的判断里,虽然可读性稍差,但能实现相同效果:
SELECT CASE WHEN SUBSTRING(a.DET_NOMINALDR, 3, 2) = 'BS' THEN 0 ELSE a.DET_NOMINALDR END AS NEW_DET_NOMINALDR, CASE WHEN SUBSTRING(a.DET_NOMINALCR, 3, 2) = 'BS' THEN 0 ELSE a.DET_NOMINALCR END AS NEW_DET_NOMINALCR, CASE WHEN (CASE WHEN SUBSTRING(a.DET_NOMINALDR,3,2) = 'BS' THEN 0 ELSE a.DET_NOMINALDR END) = 0 THEN (CASE WHEN SUBSTRING(a.DET_NOMINALCR,3,2) = 'BS' THEN 0 ELSE a.DET_NOMINALCR END) ELSE (CASE WHEN SUBSTRING(a.DET_NOMINALDR,3,2) = 'BS' THEN 0 ELSE a.DET_NOMINALDR END) END AS NOMINAL FROM your_table_name a;
额外提醒
一定要检查字符串的引号,中文单引号会被SQL当成普通字符,导致匹配逻辑失效,进而出现空值或不符合预期的结果。
内容的提问来源于stack exchange,提问作者Artur Dzido
相关产品推荐
相关产品推荐

