我有一個包含以下資料的表格
表:emp
| 姓名 |
|---|
| 一種 |
| 乙 |
| C |
| D |
預期輸出:
| 名字 |
|---|
| 一種 |
| AB |
| 美國廣播公司 |
| A B C D |
我只知道如何以水平形式列印資料
SELECT LISTAGG(name,'|')
FROM emp;
不知道如何切割水平并獲得預期的輸出
uj5u.com熱心網友回復:
您可以使用分層查詢:
SELECT REPLACE(SYS_CONNECT_BY_PATH(name, '|'), '|') AS names
FROM ( SELECT ROW_NUMBER() OVER (ORDER BY name) AS rn,
name
FROM emp )
START WITH rn = 1
CONNECT BY PRIOR rn 1 = rn;
其中,對于樣本資料:
CREATE TABLE emp (name) AS
SELECT 'A' FROM DUAL UNION ALL
SELECT 'B' FROM DUAL UNION ALL
SELECT 'C' FROM DUAL UNION ALL
SELECT 'D' FROM DUAL;
輸出:
姓名 一種 AB 美國廣播公司 A B C D
db<>在這里擺弄
uj5u.com熱心網友回復:
這是一種選擇:
SQL> with test (col) as
2 (select 'A' from dual union all
3 select 'B' from dual union all
4 select 'C' from dual union all
5 select 'D' from dual
6 ),
7 temp as
8 (select listagg(col) within group (order by col) val,
9 count(*) cnt
10 from test
11 )
12 select substr(val, 1, level) result
13 from temp
14 connect by level <= cnt;
RESULT
----------
A
AB
ABC
ABCD
SQL>
基本上,在tempCTE 聚合列值(并找到行數),然后在分層查詢中獲取子字串,該查詢的級別與表中的行數一樣多。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/314311.html
