在Oracle僅使用CONNECT BY水平的方法(見here),有幾個注意事項:
select rownum, id,
substr(']'||check_number||']'
,instr(']'||check_number||']',']',1,level)+1
,instr(']'||check_number||']',']',1,level+1)
- instr(']'||check_number||']',']',1,level) - 1) C1VALUE,
substr(']'||amount||']'
,instr(']'||amount||']',']',1,level)+1
,instr(']'||amount||']',']',1,level+1)
- instr(']'||amount||']',']',1,level) - 1) C2VALUE
from table
connect by id = prior id and prior dbms_random.value is not null
and level <= length(check_number) - length(replace(check_number,']')) + 1
ROWNUM ID C1VALUE C2VALUE
1 1 1001 200
2 1 1002 300
3 1 1003 100
4 2 2001 500
5 2 2002 1000
6 3 3002 100
7 3 3004 300
8 3 3005 600
9 3 3007 200
本質上講,我們吹熄使用分層查詢函數,然後只獲取check_number和amount列中每個「列」數據中的數據的子字符串。
主要的警告:數據被轉化必須有相同數量的兩列「數據元素」的,因爲我們使用的首列「計數」進行改造的項目數。
我已經在11gR2上測試過了。 YMMV也取決於DMBS版本。請注意需要使用「PRIOR」運算符,它可以防止oracle進入循環的無限連接。
你想用'id'列做什麼?爲轉換後的數據集生成一個新值? – Phil
'sql-server'或'oracle'?或者你在兩個RDBMS上真的有這個問題嗎? – MatBailie
什麼是數據的來源?在將數據加載到數據庫之前,您是否可以選擇重新格式化數據? –