dbt_valid_to为null时用CASE WHEN赋值为当日日期仍返回null问题求解
问题原因分析
- 语法逻辑错误:SQL中
CASE WHEN的作用是返回匹配条件对应的值,而非对字段进行赋值操作。你在THEN后写的o_s.dbt_valid_to = GETDATE()是布尔判断表达式,只会返回True/False/Null,而非你想要的当前日期值。 - 缺少
ELSE分支:如果dbt_valid_to不为空的场景下,你没有指定返回值,CASE WHEN会默认返回NULL,导致最终字段全部为NULL。 - 字段重复定义问题:你在
SELECT语句中先后两次定义了名为Valid_to的字段,第一次直接取原始值o_s.dbt_valid_to AS Valid_to,第二次是CASE WHEN的计算结果,虽然数据库一般会按顺序取后定义的结果,但建议删除重复的原始字段定义避免歧义。
修正方案
你可以选择修正CASE WHEN的写法,也可以用更简洁的COALESCE函数实现相同逻辑(COALESCE会返回第一个非NULL的参数,刚好匹配空值替换的需求),修正后的完整代码如下:
FROM ( SELECT DISTINCT (coalesce(o_s.amount,0) / o_s.term_multiplier_c) * 12 AS Amount, o_s.stage_name AS Opportunities_Stage, o_s.id AS ID, o_s.name AS Name, o_s.license_version_c AS Liscence_Version, o_s.dbt_updated_at AS Updated_time, o_s.dbt_valid_from AS Valid_from, GETDATE() AS date, -- 修正后的CASE WHEN写法,二选一即可 CASE WHEN o_s.dbt_valid_to IS NULL THEN GETDATE() ELSE o_s.dbt_valid_to END AS Valid_to -- 更简洁的等效替换写法:COALESCE(o_s.dbt_valid_to, GETDATE()) AS Valid_to --case when Valid_to IS NULL then Last_date=GETDATE() else Last_date=Valid_to end Last_date From {{ref('opportunities_snapshot')}} o_s GROUP BY o_s.name, o_s.amount, o_s.stage_name, o_s.id, o_s.license_version_c, o_s.dbt_updated_at, o_s.dbt_valid_from, o_s.dbt_valid_to, o_s.term_multiplier_c )
内容的提问来源于stack exchange,提问作者Karthikcharan Suresh
相关产品推荐
相关产品推荐

