Oracle中如何实现列转行的数据转换?
Oracle 列转行数据转换方案
示例数据
| ID | A_ID | B_ID | C_ID | D_ID |
|---|---|---|---|---|
| 1 | 'ABC' | 'XYZ' | 'PLO' | 'QWE' |
预期输出
| ID | A_ID |
|---|---|
| 1 | 'ABC' |
| 1 | 'XYZ' |
| 1 | 'PLO' |
| 1 | 'QWE' |
实现方法
方法1:使用UNION ALL
适合列数量较少的场景,通过拆分每列查询后合并结果:
SELECT ID, A_ID AS A_ID FROM your_table UNION ALL SELECT ID, B_ID FROM your_table UNION ALL SELECT ID, C_ID FROM your_table UNION ALL SELECT ID, D_ID FROM your_table;
注:
UNION ALL会保留所有行,若需去重可替换为UNION,但列转行场景通常不需要去重。
方法2:使用Oracle UNPIVOT语法
Oracle 11g及以上版本支持该语法,写法更简洁,适配多列场景:
SELECT ID, A_ID FROM your_table UNPIVOT ( A_ID FOR temp_col IN (A_ID, B_ID, C_ID, D_ID) );
A_ID:指定转换后值列的名称(对应预期输出的A_ID列)temp_col:临时列名,用于存储原表的列名(无需保留时可省略,直接写A_ID IN (A_ID, B_ID, C_ID, D_ID))
如果需要保留原列名信息,可调整为:
SELECT ID, original_col, A_ID FROM your_table UNPIVOT ( A_ID FOR original_col IN ( A_ID AS 'A_ID', B_ID AS 'B_ID', C_ID AS 'C_ID', D_ID AS 'D_ID' ) );
此时结果会新增original_col列,显示每个值对应的原表列名。
内容的提问来源于stack exchange,提问作者Dhivya
相关产品推荐
相关产品推荐

