數據如下:
name id
張三 1,2,3
要求實現:
name id
張三 1
張三 2
張三 3
--創建臨時表 create table tmp as(select '張三' name, '1,2,3' id from dual); --寫法1 select name,regexp_substr(id,'[^,]+',1,level) as id from tmp connect by level <= regexp_count(id,',')+1 order by id --寫法2: select name,trim(regexp_substr(id,'[^,]+',1,level)) as id from tmp connect by name = prior name and prior dbms_random.value is not null and level <= length(regexp_replace(id, '[^,]'))+1; --寫法3 select name, --regexp_replace(id,'(\w+)\,(\w+)\,(\w+)',level) id regexp_replace(id,'(\w+)\,(\w+)\,(\w+)','\'||to_char(level)) id from tmp connect by level <= regexp_count(id,',')+1; --寫法4: select name, substr(','||id||',',instr(','||id||',', ',', 1, level) + 1, instr(','||id||',', ',', 1, level + 1) -( instr(','||id||',', ',', 1, level) + 1)) from tmp connect by level <= regexp_count(id,',')+1 order by level
此外,列轉行還可以使用union all和unpivot(oracle 11g新特性)等,待后續補充
