oracle列转行函数大全 四种用法概述
在数据处理中,经常需要将列按照行拆分,这里我们介绍一下在Oracle数据库中几种列转行的方法。
1. 使用UNION ALL
使用UNION ALL是一种常见的列转行的方法。将需要拆分的列通过UNION ALL合并成一列,再通过SELECT和CASE WHEN来重新构造为行。
SELECT id, 'col1' AS col_name, col1 AS col_value FROM table_name
UNION ALL
SELECT id, 'col2' AS col_name, col2 AS col_value FROM table_name
UNION ALL
SELECT id, 'col3' AS col_name, col3 AS col_value FROM table_name
2. 使用UNPIVOT
UNPIVOT功能可以将多个列转化为一列,通过UNPIVOT将需要拆分的列转换为行。
SELECT id, col_name, col_value FROM
(SELECT id, col1, col2, col3 FROM table_name)
UNPIVOT (col_value FOR col_name IN (col1 AS 'col1', col2 AS 'col2', col3 AS 'col3'))
3. 使用CROSS APPLY
CROSS APPLY是一种行级别函数,能够将一行数据转化为多行数据。通过使用CROSS APPLY,可以将需要拆分的列转化为多行。
SELECT id,t.*
FROM table_name
CROSS APPLY
(
VALUES ('col1',col1),
('col2',col2),
('col3',col3)
) t (col_name, col_value)
4. 使用CONNECT BY LEVEL
使用CONNECT BY LEVEL可以生成多行数据。通过使用CONNECT BY LEVEL来生成所需要的行数,然后通过CASE WHEN语句将需要拆分的列转换为行。
SELECT id,
CASE
WHEN level = 1 THEN 'col1'
WHEN level = 2 THEN 'col2'
WHEN level = 3 THEN 'col3'
END AS col_name,
CASE
WHEN level = 1 THEN col1
WHEN level = 2 THEN col2
WHEN level = 3 THEN col3
END AS col_value
FROM table_name
CONNECT BY level <= 3
以上就是Oracle四种列转行的方法,可以根据实际业务场景灵活运用。