WITH Levels(String) AS ( SELECT '1-2 2011-11-15 07:42:33;2-3 2011-11-27 13:51:37;3-4 2011-12-06 07:12:37;4-5 2011-12-09 15:28:52;5-6 2011-12-30 10:53:44;6-7 2012-02-02 07:06:41;7-8 2012-03-20 06:36:12;8-9 2012-05-25 11:46:56;9-10 2012-08-14 06:04:53;10-11 2013-09-04 07:38:12;11-12 2014-03-26 06:30:49;12-13 2014-06-18 10:51:18;13-14 2014-11-13 14:14:53;14-15 2015-06-10 09:12:30' FROM Dual ), Split(Lvl, When, String) AS ( SELECT SUBSTR(String, INSTR(String, '-') + 1, 2), REPLACE(SUBSTR(String, INSTR(String, '-') + 03, 20), ';'), REPLACE(SUBSTR(String, INSTR(String, '-') + 23), ';', ' ') FROM Levels UNION ALL SELECT CAST(Split.Lvl + 1 AS VARCHAR2(2)), SUBSTR(Split.String, INSTR(Split.String, '-') + 03, 20), SUBSTR(Split.String, INSTR(Split.String, '-') + 23) FROM Split, Levels WHERE Split.String IS NOT NULL ) SELECT Lvl, When FROM Split;