Đâ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, '[^,]+')) + 1sử 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.OdciNumberListchuyể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ả.
-
-
FROMkhô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_valuevớ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.projectlà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