SQL中无需UNION ALL将多列转换为单列的实现方法
不用UNION ALL实现多列转单列的SQL方案
你需要把横向的三列数据转成纵向单列,同时避免重复编写复杂查询逻辑,以下是不同数据库环境下的可行方案:
1. SQL Server/Oracle:用UNPIVOT原生操作符
UNPIVOT是专门做列转行的语法,能直接复用你的查询逻辑,不用重复写三次:
SELECT [1] FROM TableZ UNPIVOT ( [1] FOR Columns IN ([Field A], [Field B], [Field C]) ) AS UnpivotResult;
2. PostgreSQL:用UNNEST+ARRAY组合
利用数组构造和拆分数组的函数实现转换:
SELECT unnest(ARRAY["Field A", "Field B", "Field C"]) AS "1" FROM TableZ;
3. MySQL 8.0+:用JSON_TABLE+JSON_ARRAY
借助JSON函数构造数组并展开成单行:
SELECT j.col AS `1` FROM TableZ, JSON_TABLE( JSON_ARRAY(`Field A`, `Field B`, `Field C`), '$[*]' COLUMNS (col VARCHAR(255) PATH '$') ) j;
4. 通用兼容方案:用CTE封装核心逻辑
如果你的数据库不支持上面的原生函数,可以把复杂查询封装成CTE(公共表表达式),只写一次核心逻辑,后面只引用CTE就行:
WITH ComplexQuery AS ( -- 这里只写一次你的复杂查询,包括过滤、关联等所有逻辑 SELECT `Field A`, `Field B`, `Field C` FROM TableZ -- 比如 WHERE xxx JOIN xxx 这类复杂条件都放这 ) SELECT `Field A` AS `1` FROM ComplexQuery UNION ALL SELECT `Field B` AS `1` FROM ComplexQuery UNION ALL SELECT `Field C` AS `1` FROM ComplexQuery;
这个方案虽然还是用到了UNION ALL,但核心的复杂查询只需要编写一次,避免了重复代码的问题。
内容的提问来源于stack exchange,提问作者Tonathiu Redrovan
相关产品推荐
相关产品推荐

