Vấn đề trong truy vấn của bạn là mệnh đề where sẽ chỉ được áp dụng cho cấp độ 1 chứ không áp dụng thêm nữa.
Hãy thử điều này bằng cách sử dụng bảng lồng nhau:
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;
Đó là một truy vấn mục đích chung mà bạn có thể sử dụng ngay cả khi không có mệnh đề where nếu bạn muốn chuyển đổi tất cả chúng cùng một lúc.
Trong Oracle 12c +, bạn có thể sử dụng OUTER APPLY
để đạt được hiệu quả tương tự và cú pháp đơn giản hơn:
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;