如何在Snowflake中用CASE语句展示NULL与值的双向转换
解决NULL与值之间转换关系的SQL查询问题
问题场景
现有表结构及数据如下:
| ID | COUNTRY_1 | COUNTRY_2 |
|---|---|---|
| 5 | USA | CAN |
| 6 | NULL | USA |
| 7 | MEX | NULL |
需要编写SQL查询,将两个列的转换关系合并到单个CHANGES列,预期结果:
| ID | CHANGES |
|---|---|
| 5 | USA -> CAN |
| 6 | NULL -> USA |
| 7 | MEX -> NULL |
原查询语句:
SELECT ID, CASE WHEN COUNTRY_1 <> COUNTRY_2 THEN COUNTRY_1 || '->' || COUNTRY_2 ELSE '' END AS CHANGES FROM MY_TABLE
执行后ID为6和7的行CHANGES列是空值,无法展示NULL与值的双向转换。
解决方案
修改后的SQL查询如下:
SELECT ID, COALESCE(COUNTRY_1, 'NULL') || ' -> ' || COALESCE(COUNTRY_2, 'NULL') AS CHANGES FROM MY_TABLE
原因说明
- NULL值的处理:SQL中NULL与任何值进行拼接时,结果都会变为NULL。使用
COALESCE函数可以将NULL值替换为字符串'NULL',确保拼接后能正常显示转换关系。 - 条件判断的问题:原查询中的
COUNTRY_1 <> COUNTRY_2条件在涉及NULL时会返回NULL(因为NULL和任何值比较的结果都是未知),导致这些行进入ELSE分支返回空字符串。而需求是所有行都要展示转换关系,因此不需要这个条件判断,直接拼接处理后的字段即可。
执行结果
执行修改后的查询后,将得到符合预期的结果:
| ID | CHANGES |
|---|---|
| 5 | USA -> CAN |
| 6 | NULL -> USA |
| 7 | MEX -> NULL |
内容的提问来源于stack exchange,提问作者Angela B
相关产品推荐
相关产品推荐

