Oracle 设置:
CREATE TABLE table_name ( col1, col2, col3, col4, col5, col6 ) AS
SELECT 'abc', '02', '03', '02', '05', '07' FROM DUAL UNION ALL
SELECT 'abc', '05', '04', '02', '03', '01' FROM DUAL UNION ALL
SELECT 'abc', '01', '01', '01', '01', '01' FROM DUAL;
CREATE TYPE stringlist AS TABLE OF VARCHAR2(100);
/
查询 - 不使用用户定义的函数:
SELECT MAX( col1 ) AS col1,
MAX( CASE rn WHEN 1 THEN value END ) AS col2,
MAX( CASE rn WHEN 2 THEN value END ) AS col3,
MAX( CASE rn WHEN 3 THEN value END ) AS col4,
MAX( CASE rn WHEN 4 THEN value END ) AS col5,
MAX( CASE rn WHEN 5 THEN value END ) AS col6
FROM (
SELECT col1,
rid,
ROW_NUMBER() OVER (PARTITION BY t.rid ORDER BY v.column_value) AS rn,
v.COLUMN_VALUE AS value
FROM ( SELECT col1,
ROWID AS rid,
SET( stringlist( col2, col3, col4, col5, col6 ) ) AS cols
FROM table_name ) t,
TABLE( t.cols ) v
)
GROUP BY rid;
查询 - 使用 UDF:
CREATE FUNCTION nth_item(
collection STRINGLIST,
n INT
) RETURN VARCHAR2 DETERMINISTIC
AS
BEGIN
IF collection IS NULL OR n < 1 OR n > collection.COUNT THEN
RETURN NULL;
END IF;
RETURN collection(n);
END;
/
然后:
SELECT col1,
nth_item( cols, 1 ) AS col2,
nth_item( cols, 2 ) AS col3,
nth_item( cols, 4 ) AS col4,
nth_item( cols, 4 ) AS col5,
nth_item( cols, 5 ) AS col6
FROM (
SELECT col1,
SET( stringlist( col2, col3, col4, col5, col6 ) ) AS cols
FROM table_name
);
输出(对于两个查询):
COL1 COL2 COL3 COL4 COL5 COL6
---- ---- ---- ---- ---- ----
abc 02 03 05 07
abc 01 02 03 04 05
abc 01