使用SQL CASE语句实现多列非空值顺序填充的数据迁移转换
数据迁移转换SQL实现(基于CASE语句)
核心SQL代码
SELECT ID, -- 填充col1:按优先级取第一个非空源列 CASE WHEN source1 IS NOT NULL THEN source1 WHEN source2 IS NOT NULL THEN source2 WHEN source3 IS NOT NULL THEN source3 WHEN source4 IS NOT NULL THEN source4 ELSE NULL END AS col1, -- 填充col2:在col1取值的源列之后,找下一个非空值 CASE WHEN col1 = source1 THEN CASE WHEN source2 IS NOT NULL THEN source2 WHEN source3 IS NOT NULL THEN source3 WHEN source4 IS NOT NULL THEN source4 ELSE NULL END WHEN col1 = source2 THEN CASE WHEN source3 IS NOT NULL THEN source3 WHEN source4 IS NOT NULL THEN source4 ELSE NULL END WHEN col1 = source3 THEN source4 ELSE NULL END AS col2, -- 填充col3:在col2取值的源列之后,找下一个非空值 CASE WHEN col2 = source2 THEN CASE WHEN source3 IS NOT NULL THEN source3 WHEN source4 IS NOT NULL THEN source4 ELSE NULL END WHEN col2 = source3 THEN source4 ELSE NULL END AS col3, -- 填充col4:仅当col3来自source3时,取source4的非空值 CASE WHEN col3 = source3 THEN source4 ELSE NULL END AS col4 FROM your_table_name;
逻辑说明
- col1:遵循
source1 > source2 > source3 > source4的优先级,提取第一个非空值 - col2:基于col1的来源列,在后续优先级的源列中提取第一个非空值
- col3:基于col2的来源列,在后续优先级的源列中提取第一个非空值
- col4:仅当col3来自source3时,提取source4的非空值
源数据示例
| ID | source1 | source2 | source3 | source4 |
|---|---|---|---|---|
| 1 | val1.3 | |||
| 2 | val2.1 | val2.2 | ||
| 3 | val3.1 | val3.2 | val3.3 | val3.4 |
| 4 | val4.2 | val4.3 | val4.4 | |
| 5 | val5.3 | val5.4 | ||
| 6 | val6.1 | val6.3 | ||
| 7 | val7.2 | val7.4 | ||
| 8 | val8.1 | val8.2 | val8.4 | |
| 9 | val9.1 | val9.3 | val9.4 | |
| 10 | val10.1 | val10.2 | val10.3 |
预期结果
| ID | col1 | col2 | col3 | col4 |
|---|---|---|---|---|
| 1 | val1.3 | |||
| 2 | val2.1 | val2.2 | ||
| 3 | val3.1 | val3.2 | val3.3 | val3.4 |
| 4 | val4.2 | val4.3 | val4.4 | |
| 5 | val5.3 | val5.4 | ||
| 6 | val6.1 | val6.3 | ||
| 7 | val7.2 | val7.4 | ||
| 8 | val8.1 | val8.2 | val8.4 | |
| 9 | val9.1 | val9.3 | val9.4 | |
| 10 | val10.1 | val10.2 | val10.3 |
内容的提问来源于stack exchange,提问作者KoustubhK
相关产品推荐
相关产品推荐

