A more flexible and better solution that:
- It does not depend on the predictability of the number of elements in the row.
- independent of the identifier column, the solution gives the correct result regardless of the number of columns.
- not even dependent on the DISTINCT keyword.
There are other examples using XMLTABLE and the MODEL clause , please read Separate the comma of a row in a table .
For instance,
Without column ID:
SQL> WITH T AS 2 (SELECT 'abc fgh dwd' AS text FROM dual 3 UNION 4 SELECT 'dfs dfd dfg' AS text FROM dual 5 UNION 6 SELECT 'dfs' AS text FROM Dual 7 UNION 8 SELECT 'dfd dfw' AS text FROM dual 9 ) 10 SELECT trim(regexp_substr(t.text, '[^ ]+', 1, lines.column_value)) text 11 FROM t, 12 TABLE (CAST (MULTISET 13 (SELECT LEVEL FROM dual CONNECT BY instr(t.text, ' ', 1, LEVEL - 1) > 0 14 ) AS sys.odciNumberList )) lines 15 / TEXT ----------- abc fgh dwd dfd dfw dfs dfs dfd dfg 9 rows selected.
With the Identifier column:
SQL> WITH T AS 2 (SELECT 123 AS id, 'abc fgh dwd' AS text FROM dual 3 UNION 4 SELECT 243 AS id, 'dfs dfd dfg' AS text FROM dual 5 UNION 6 SELECT 353 AS Id, 'dfs' AS text FROM Dual 7 UNION 8 SELECT 424 AS id, 'dfd dfw' AS text FROM dual 9 ) 10 SELECT id, trim(regexp_substr(t.text, '[^ ]+', 1, lines.column_value)) text 11 FROM t, 12 TABLE (CAST (MULTISET 13 (SELECT LEVEL FROM dual CONNECT BY instr(t.text, ' ', 1, LEVEL - 1) > 0 14 ) AS sys.odciNumberList )) lines 15 ORDER BY id 16 / ID TEXT ---------- ----------- 123 abc 123 fgh 123 dwd 243 dfs 243 dfd 243 dfg 353 dfs 424 dfd 424 dfw 9 rows selected. SQL>
source share