Một cái gì đó như thế này (giả sử không có hàng trùng lặp nào trong bảng nhập liệu - nếu có, giải pháp cần được sửa đổi một chút).
Trong giải pháp, tôi xây dựng test_table để thử nghiệm (nó không phải là một phần của giải pháp) và tôi xây dựng một truy vấn con có tính giai thừa khác trong mệnh đề WITH. Điều này hoạt động trong Oracle 11 trở lên. Đối với các phiên bản trước của Oracle, truy vấn con được định nghĩa là prep
thay vào đó cần được chuyển dưới dạng truy vấn con trong truy vấn cuối cùng.
with
test_table ( id, identifiers ) as (
select '1', '|1|2|' from dual union all
select '1', '|2|1|' from dual union all
select '2', '|3|A|1|B|' from dual union all
select '2', '|B|1|3|A|' from dual union all
select '3', '|1|3|2|' from dual union all
select '3', '|1|5|' from dual union all
select '3', '|2|1|3|' from dual union all
select '4', '|AA|BB|1|3A|' from dual union all
select '4', '|1|3A|AA|BB|' from dual
),
prep ( id, identifiers, token ) as (
select id, identifiers, regexp_substr(identifiers, '[^|]+', 1, level)
from test_table
connect by level <= regexp_count(identifiers, '\|') - 1
and prior identifiers = identifiers
and prior sys_guid() is not null
)
select distinct id,
'|' || listagg(token, '|') within group (order by token) || '|'
as identifiers
from prep
group by id, identifiers
order by id, identifiers -- ORDER BY is optional
;
Đầu ra :
ID IDENTIFIERS
--- --------------------
1 |1|2|
2 |1|3|A|B|
3 |1|2|3|
3 |1|5|
4 |1|3A|AA|BB|
5 rows selected.