Oracle中合并含空值的name1与name2列并生成连续非空结果
合并Oracle表中两列的非空值为连续序列
嘿,这个需求我之前也碰到过,用Oracle的内置函数就能轻松搞定!看你的表结构,每行要么name1有值要么name2有值,正好适配COALESCE()函数的能力——它的作用就是返回传入参数里第一个非空的值,完美匹配你的场景。
最简洁的解决方案
直接用COALESCE提取每行的非空值,再排序就能得到你要的连续序列:
SELECT COALESCE(name1, name2) AS merged_value FROM your_table_name ORDER BY merged_value;
这段SQL会自动把每行里非空的那个值(不管在name1还是name2列)挑出来,最后通过ORDER BY把结果排成1、2、3、4这种有序的序列。
处理可能的重复值(可选)
如果你的数据里存在重复的非空值,想要去重的话,只需要加个DISTINCT关键字:
SELECT DISTINCT COALESCE(name1, name2) AS merged_value FROM your_table_name ORDER BY merged_value;
另一种思路:用UNION ALL合并
要是你的场景更复杂(比如某行两列都有非空值),还可以用UNION ALL分别提取两列的非空值再合并:
SELECT name1 AS merged_value FROM your_table_name WHERE name1 IS NOT NULL UNION ALL SELECT name2 AS merged_value FROM your_table_name WHERE name2 IS NOT NULL ORDER BY merged_value;
这种方式会先把name1里所有非空值查出来,再把name2里的非空值查出来,最后合并排序。如果需要去重,把UNION ALL换成UNION就行(不过UNION会自动去重,性能比UNION ALL稍差)。
内容的提问来源于stack exchange,提问作者rajesh
相关产品推荐
相关产品推荐

