select * from emp
select LISTAGG(ename,'-') within group (order by deptno desc) from emp;
可以看到功能類似wm_concat,可以自定義連接符,區別:
LISTAGG : 11g2才提供的函數,不支持distinct,拼接長度不能大於4000,函數返回為varchar2類型,最大長度為4000.
和wm_concat相比,listagg可以執行排序。例如
select deptno, listagg(ename,';')
within
group(order
by ename) enames from emp group
by deptno;
SQL Code
1
2
3
4
5
6
7
8
9
10
11
12
13
with temp as(
select 500 population, 'China' nation ,'Guangzhou' city from dual union all
select 1500 population, 'China' nation ,'Shanghai' city from dual union all
select 500 population, 'China' nation ,'Beijing' city from dual union all
select 1000 population, 'USA' nation ,'New York' city from dual union all
select 500 population, 'USA' nation ,'Bostom' city from dual union all
select 500 population, 'Japan' nation ,'Tokyo' city from dual
)
select population,
nation,
city,
listagg(city,',') within GROUP (order by city) over (partition by nation) rank
from temp
With table as 類似創建一個臨時表,只可以查詢一次,之後就被銷毀,同時可以創建多個臨時table,比如:
with sql1 as
(select to_char(a) s_name from test_tempa),
sql2 as
(select to_char(b) s_name
from test_tempb
where not exists (select s_name from sql1 where rownum = 1))
select *
from sql1
union all
select *
from sql2
行列轉換,見
Oracle行轉列、列轉行的Sql語句總結