【需求】例如先有數據為 id | name + 1001 | lottu 1001 | xuan 1001 | rax 1002 | ak 1002 | vincent 現在需要轉換為 id | names + 1001 | lottu|xuan|rax 1002 | ak|vincent 反之;o ...
【需求】例如先有數據為
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