WITH t AS ( SELECT 'a;b;c' f1, 'd;e;f' f2, 'g;h' f3 FROM dual ) SELECT gb , REGEXP_SUBSTR(v, '[^;]+', 1, lv) v FROM (SELECT DECODE(lv, 1, 'F1', 2, 'F2', 3, 'F3') gb , DECODE(lv, 1, f1 , 2, f2 , 3, f3 ) v FROM t , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 3) ) , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9) WHERE lv <= LENGTH(v) - LENGTH(REPLACE(v, ';')) + 1 ORDER BY gb, lv ;