程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> oracle VS postgresql系列-行列轉換,oraclepostgresql

oracle VS postgresql系列-行列轉換,oraclepostgresql

編輯:Oracle教程

oracle VS postgresql系列-行列轉換,oraclepostgresql


【需求】例如先有數據為
 id  |  name   
------+---------
 1001 | lottu
 1001 | xuan
 1001 | rax
 1002 | ak
 1002 | vincent
現在需要轉換為
  id  |     names      
------+----------------
 1001 | lottu|xuan|rax
 1002 | ak|vincent
反之;oracle,postgresql有如何對待
【列轉行】 oracle  對oracle;看到這樣的需求;立刻想到vm_concat,listagg函數;這樣sql就出來了
select id, vm_concat(name,'|')as names from lottu01 group by id;

select id, listagg(name,'|') within group(order by null) as names from lottu01 group by id;
 postgresql 同理也有對應的函數string_agg
=> select id,string_agg(name,'|') from lottu01 group by id;
  id  |   string_agg   
------+----------------
 1002 | ak|vincent
 1001 | lottu|xuan|rax
【行轉列】 oracle   這個一看就要使用分割函數;對oracle目前是不存在split函數 分割函數這個可以查考--http://www.cnblogs.com/lottu/p/4013751.html 當然我們可以用其他函數來替代 正則函數 regexp_substr
select id,regexp_substr(names,'[^|]+',1,level) as name from lottu02
connect by id = prior id
and prior dbms_random.value is not null
and level <= length(regexp_replace(names, '[^|]'))+1;
#或者
select id,regexp_substr(names,'[^|]+',1,level) as name from lottu02
connect by id = prior id
and prior dbms_random.value is not null
and level <= regexp_count(names, '\|')+1;
postgresql  postgresql裡面有分割函數--split_part;還是不能按照上面的寫法來改;因為目前的postgresql不支持 connect by語法 不過沒關系;postgresql針對這個有個正則函數--regexp_split_to_table;可以直接實現。
=> select id,regexp_split_to_table(names,'\|') from lottu02;
  id  | regexp_split_to_table 
------+-----------------------
 1001 | lottu
 1001 | xuan
 1001 | rax
 1002 | ak
 1002 | vincen

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved