SQL实现多列数据转单列输出的SELECT语句编写咨询
实现方案
你需要实现的是**逆透视(UNPIVOT)**操作,属于SQL标准集合操作,执行效率远高于游标遍历,不同场景下的实现写法如下:
全数据库通用兼容写法
所有关系型数据库都支持该写法,不需要依赖数据库特有语法,性能表现稳定:
SELECT id, d1 AS `column 1` FROM 你的表名 WHERE d1 IS NOT NULL AND TRIM(d1) != '' UNION ALL SELECT id, d2 AS `column 1` FROM 你的表名 WHERE d2 IS NOT NULL AND TRIM(d2) != '' ORDER BY id;
如果不需要保留重复值,可以将UNION ALL替换为UNION即可,对应执行效率会略低。如果需要和示例输出顺序完全对齐,可以调整排序规则为ORDER BY id, CASE WHEN 来源列 = 'd1' THEN 1 ELSE 2 END, column 1``。
主流数据库特有简化写法
MySQL 8.0+、PostgreSQL、Oracle、SQL Server都支持原生UNPIVOT语法,写法更简洁:
SELECT id, `column 1` FROM 你的表名 UNPIVOT ( `column 1` FOR 来源列 IN (d1, d2) ) AS unpvt WHERE `column 1` IS NOT NULL AND TRIM(`column 1`) != '' ORDER BY id;
SQL Server环境下仅需要将语句中的反引号替换为方括号即可正常执行。
内容的提问来源于stack exchange,提问作者Peter Sun
相关产品推荐
相关产品推荐

