WITH t AS ( SELECT 1 pk, '(A3200 + B2100) * 100 / 5' v FROM dual UNION ALL SELECT 2, '((A3200 - B2100) * 100)' FROM dual ) SELECT pk, v, lv , REGEXP_SUBSTR(v, '[()*/+-]|[^ ()*/+-]+', 1, lv) FROM t , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99) WHERE lv <= REGEXP_COUNT(v, '[()*/+-]|[^ ()*/+-]+') ORDER BY pk, lv ;