Из строки в столбцы

xymbo
Дата: 21.11.2009 23:29:41
Добрый вечер!
Реализовал разбиение строки по определенным параметрам на 4 столбца, ниже приведу пример. Сделал это все через instr и substr(без использования функции). Возникает вопрос, можно ли как-то сделать красивее? :)

Исходный данные:
WITH t as (
     SELECT '12.45 test..123sdf wer;' str from dual UNION ALL
     SELECT '12.56 test..12sdf wer;45.1 test2 a;' str from dual UNION ALL
     SELECT '' str from dual UNION ALL
     SELECT '11.1 test..456sdf wer6; test3;' str from dual UNION ALL
     SELECT '15.2 555..;14.5 test4;24.5 d;12.4 H;' str from dual)
Результат:
code1 name1 code2 name2 code3 name3 code4 name4
12.45 test..123sdf wer NULL NULL NULL NULL NULL NULL
12.56 test..12sdf wer 45.1 test2 a NULL NULL NULL NULL
NULL NULL NULL NULL NULL NULL NULL NULL
11.1 test..456sdf wer6 NULL test3 NULL NULL NULL NULL
15.2 555.. 14.5 test4 24.5 d 12.4 H


Надеюсь, что понятно. :) И так, столбцы с кодами формируются по цифрам, следующим "в начале подстроки", то есть отталкиваемся сначала с первого символа, а затем уже от ";". А названия вычисляются после "первого" пробела в подстроке.

P.S. Вечером вот как раз вспомнил, и решил спросить. :)
PooH_2
Дата: 22.11.2009 04:30:00
не намного красивее, наверно, но у меня получилось так:
WITH t as (
     SELECT '12.45 test..123sdf wer;' str from dual UNION ALL
     SELECT '12.56 test..12sdf wer;45.1 test2 a;' str from dual UNION ALL
     SELECT '' str from dual UNION ALL
     SELECT '11.1 test..456sdf wer6; test3;' str from dual UNION ALL
     SELECT '15.2 555..;14.5 test4;24.5 d;12.4 H;' str from dual)
     SELECT substr(ss1,1,instr(ss1,' ')-1) code1, substr(ss1,instr(ss1,' ')+1) name1,
            substr(ss2,1,instr(ss2,' ')-1) code2, substr(ss2,instr(ss2,' ')+1) name2,
            substr(ss3,1,instr(ss3,' ')-1) code3, substr(ss3,instr(ss3,' ')+1) name3,
            substr(ss4,1,instr(ss4,' ')-1) code4, substr(ss4,instr(ss4,' ')+1) name4
      FROM
     (SELECT regexp_substr(t.str,'([^;])*\s+([^;]*)',1,1) ss1,
            regexp_substr(t.str,'([^;])*\s+([^;]*)',1,2) ss2,
            regexp_substr(t.str,'([^;])*\s+([^;]*)',1,3) ss3,
            regexp_substr(t.str,'([^;])*\s+([^;]*)',1,4) ss4 FROM t)s;

где
regexp_substr(t.str,'([^;])*\s+([^;]*)',1,N)
выбор подстроки N

CODE1NAME1CODE2NAME2CODE3NAME3CODE4NAME4
112.45test..123sdf wer
212.56test..12sdf wer45.1test2 a
3
411.1test..456sdf wer6test3
515.2555..14.5test424.5d12.4H
xymbo
Дата: 22.11.2009 11:32:00
Спасибо за решение! Красивее, чем у меня, так как я не использовал regexp.