Đây có thể là một cách cải tiến (cũng với regexp và kết nối bằng cách):
with temp as
(
select 108 Name, 'test' Project, 'Err1, Err2, Err3' Error from dual
union all
select 109, 'test2', 'Err1' from dual
)
select distinct
t.name, t.project,
trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value)) as error
from
temp t,
table(cast(multiset(select level from dual connect by level <= length (regexp_replace(t.error, '[^,]+')) + 1) as sys.OdciNumberList)) levels
order by name
CHỈNH SỬA :Đây là một giải thích đơn giản (chẳng hạn như "không chuyên sâu") về truy vấn.
-
length (regexp_replace(t.error, '[^,]+')) + 1
sử dụngregexp_replace
để xóa bất kỳ thứ gì không phải là dấu phân cách (trong trường hợp này là dấu phẩy) vàlength +1
để biết có bao nhiêu phần tử (lỗi). -
Cấp độ chọn
select level from dual connect by level <= (...)
sử dụng truy vấn phân cấp để tạo một cột có số lượng kết quả phù hợp ngày càng tăng, từ 1 đến tổng số lỗi.Xem trước:
select level, length (regexp_replace('Err1, Err2, Err3', '[^,]+')) + 1 as max from dual connect by level <= length (regexp_replace('Err1, Err2, Err3', '[^,]+')) + 1
-
table(cast(multiset(.....) as sys.OdciNumberList))
thực hiện một số ép kiểu oracle.-
cast(multiset(.....)) as sys.OdciNumberList
chuyển đổi nhiều tập hợp (một tập hợp cho mỗi hàng trong tập dữ liệu ban đầu) thành một tập hợp số duy nhất, OdciNumberList. -
table()
hàm biến đổi một tập hợp thành một tập kết quả.
-
-
FROM
không có liên kết sẽ tạo tham gia chéo giữa tập dữ liệu của bạn và tập hợp đa. Kết quả là một hàng trong tập dữ liệu có 4 kết quả phù hợp sẽ lặp lại 4 lần (với một số tăng dần trong cột có tên "column_value").Xem trước:
select * from temp t, table(cast(multiset(select level from dual connect by level <= length (regexp_replace(t.error, '[^,]+')) + 1) as sys.OdciNumberList)) levels
-
trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value))
sử dụngcolumn_value
với tư cách là nth_appearance / ocention tham số choregexp_substr
. - Bạn có thể thêm một số cột khác từ tập dữ liệu của mình (
t.name, t.project
làm ví dụ) để dễ hình dung.
Một số tham chiếu đến tài liệu Oracle:
- REGEXP_REPLACE
- REGEXP_SUBSTR
- Hằng số mở rộng, loại và ánh xạ (OdciNumberList)
- CAST (nhiều tập hợp)
- Truy vấn phân cấp