Điều này sẽ thực hiện thủ thuật:
SELECT DISTINCT ID, regexp_substr("Strings", '[^ ]+', 1, LEVEL)
FROM T
CONNECT BY regexp_substr("Strings", '[^ ]+', 1, LEVEL) IS NOT NULL
ORDER BY ID;
Lưu ý cách tôi đã sử dụng regexp_substr
trong mệnh đề connect by nữa. Điều này là để giải quyết trường hợp có nhiều dấu cách.
Nếu bạn có giới hạn trên có thể dự đoán được về số lượng mục trên mỗi dòng, thì bạn có thể so sánh hiệu suất của truy vấn đệ quy ở trên với một CROSS JOIN
đơn giản :
WITH N as (SELECT LEVEL POS FROM DUAL CONNECT BY LEVEL < 10)
-- ^^
-- up to 10 substrings
SELECT ID, regexp_substr("Strings", '[^ ]+', 1, POS)
FROM T CROSS JOIN N
WHERE regexp_substr("Strings", '[^ ]+', 1, POS) IS NOT NULL
ORDER BY ID;
Xem http://sqlfiddle.com/#!4/444e3/1 để biết bản trình diễn trực tiếp