आपकी क्वेरी में समस्या यह है कि जहां क्लॉज केवल लेवल 1 पर लागू होगा, आगे नहीं।
नेस्टेड टेबल का उपयोग करके इसे आजमाएं:
WITH xtable AS (
SELECT 1 ID, '116,117,169,170,173,175,9015,44008,44367,44446,45081,45083,46779,47161,47222' AGT FROM DUAL
UNION ALL
SELECT 2 ID, '456,789' AGT FROM DUAL
UNION ALL
SELECT 3 ID, '116,117,169,170,173,175,9015,44008,44367,44446,45081,45083,46779,47161' AGT FROM DUAL
)
select regexp_substr(x.AGT,'[^,]+', 1, t.column_value) agt
from xtable x cross join table(
cast(
multiset(
select level
from dual
connect by level <= regexp_count(x.AGT,',') + 1
)as sys.odcinumberlist
)
) t
where x.id = 3;
यह एक सामान्य उद्देश्य वाली क्वेरी है जिसका उपयोग आप बिना किसी क्लॉज के भी कर सकते हैं यदि आप उन सभी को एक साथ बदलना चाहते हैं।
Oracle 12c+ में, आप OUTER APPLY
. का उपयोग कर सकते हैं समान प्रभाव और सरल सिंटैक्स प्राप्त करने के लिए:
WITH xtable AS (
SELECT 1 ID, '116,117,169,170,173,175,9015,44008,44367,44446,45081,45083,46779,47161,47222' AGT FROM DUAL
UNION ALL
SELECT 2 ID, '456,789' AGT FROM DUAL
UNION ALL
SELECT 3 ID, '116,117,169,170,173,175,9015,44008,44367,44446,45081,45083,46779,47161' AGT FROM DUAL
)
select regexp_substr(x.AGT,'[^,]+', 1, t.n) agt
from xtable x
outer apply (
select level n
from dual
connect by level <= regexp_count(x.AGT,',') + 1
) t
where x.id = 3;