Я думаю, что самое простое решение - это использование REGEXP_SUBSTR
с параметром '[^-_]+'
:
SELECT ( REGEXP_SUBSTR (val, '[^-_]+', 1, 1)
|| LPAD (REGEXP_SUBSTR (val, '[^-_]+', 1, 2), 6, '0')
|| LPAD (REGEXP_SUBSTR (val, '[^-_]+', 1, 3), 6, '0')
|| LPAD (REGEXP_SUBSTR (val, '[^-_]+', 1, 4), 6, '0'))
FROM your_table;
На вашем примере данных:
WITH data_example AS (
SELECT '4123456-1-2-3' AS val FROM dual
UNION ALL
SELECT '4123456-11-2-3' AS val FROM dual
UNION ALL
SELECT '4123456-2-221-3' AS val FROM dual
UNION ALL
SELECT 'QHD-086664-3_9375' AS val FROM dual
)
SELECT val,
( REGEXP_SUBSTR (val, '[^-_]+', 1, 1)
|| LPAD (REGEXP_SUBSTR (val, '[^-_]+', 1, 2), 6, '0')
|| LPAD (REGEXP_SUBSTR (val, '[^-_]+', 1, 3), 6, '0')
|| LPAD (REGEXP_SUBSTR (val, '[^-_]+', 1, 4), 6, '0')) AS new_val
FROM data_example;
| val | id |
----------------------------------------------------
| 4123456-1-2-3 | 4123456000001000002000003 |
| 4123456-11-2-3 | 4123456000011000002000003 |
| 4123456-2-221-3 | 4123456000002000221000003 |
| QHD-086664-3_9375 | QHD086664000003009375 |
Я надеюсь, что помог!