将一行数据变为多行,例如:
原始写法,效率很低,特别是数据量稍微大点时基本就跑不出来了
SELECT REGEXP_SUBSTR(A.ORDERID,'[^,]+', 1, LEVEL) AS ORDERID
FROM
(
SELECT ORDERID
FROM orders
WHERE INSTR(ORDERID,',')>0
AND BILLTYPE =1004
AND NVL(STATUS,0) =0
AND PERMIT =1
)
A CONNECT BY REGEXP_SUBSTR(A.ORDERID, '[^,]+', 1, LEVEL) IS NOT NULL
ORDERID
--------------------------------------------------------------------------------
89970,89962
90154,90145
90186,90187
优化后的写法
select distinct regexp_substr(t1.ORDERID, '[^,]+', 1, level) as ORDERID
from (SELECT id,ORDERID
FROM orders
WHERE INSTR(ORDERID,',')>0
AND BILLTYPE =1004
AND NVL(STATUS,0) =0
AND PERMIT =1
) t1
connect by t1.ID = prior t1.ID
and prior dbms_random.value is not null
and level <= length(t1.ORDERID) - length(regexp_replace(t1.ORDERID, ',', '')) + 1 ;
ORDERID
--------------------------------------------------------------------------------
89962
89970
90145
90154
90186
90187