Разбор строки с разделителями трубы в столбцы? - PullRequest
5 голосов
/ 31 мая 2010

У меня есть столбец со значениями, разделенными трубами, например:

'23 | 12,1 | 450 | 30 | 9 | 78 | 82,5 | 92,1 | 120 | 185 | 52 | 11'

Я хочу проанализировать этот столбец, чтобы заполнить таблицу 12 соответствующими столбцами: month1, month2, month3 ... month12.

Таким образом, месяц1 будет иметь значение 23, месяц2 - значение 12,1 и т. Д. *

Есть ли способ проанализировать его с помощью цикла или разделителя вместо того, чтобы разделять одно значение за раз с помощью substr?

Спасибо.

Ответы [ 3 ]

9 голосов
/ 31 мая 2010

Вы можете использовать regexp_substr (10 г +):

SQL> SELECT regexp_substr('23|12.1| 450|30|9|', '[^|]+', 1, 1) c1,
  2         regexp_substr('23|12.1| 450|30|9|', '[^|]+', 1, 2) c2,
  3         regexp_substr('23|12.1| 450|30|9|', '[^|]+', 1, 3) c3
  4    FROM dual;

C1 C2   C3
-- ---- ----
23 12.1  450

С циклом в PL / SQL:

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2     p_tsv  VARCHAR2(1000) := '23|12.1| 450|30|9|78|82.5|92.1|120|185|52|11';
  3     l_item VARCHAR2(100);
  4  BEGIN
  5     FOR i IN 1 .. length(p_tsv) - length(REPLACE(p_tsv, '|', '')) + 1 LOOP
  6        l_item := regexp_substr(p_tsv, '[^|]+', 1, i);
  7        dbms_output.put_line(l_item);
  8     END LOOP;
  9  END;
 10  /

23
12.1
450
30
9
78
82.5
92.1
120
185
52
11

PL/SQL procedure successfully completed

Обновление

Вы только имеют 12 столбцов, я бы написал запрос напрямую без цикла, он будет более производительным и более простым в обслуживании, чем динамический SQL (не говоря уже о том, что писать гораздо проще):

INSERT INTO your_table
   (ID, month1, month2, month3...)
   SELECT :p_id, 
          regexp_substr(:p_tsv, '[^|]+', 1, 1) c1, 
          regexp_substr(:p_tsv, '[^|]+', 1, 2) c2,
          regexp_substr(:p_tsv, '[^|]+', 1, 3) c3
          ...
     FROM dual;
0 голосов
/ 23 декабря 2014

у меня было 99 проблем Поэтому я использовал регулярные выражения Сейчас у меня 100 проблем hahahahahahaha просто объедините разделитель в начало и конец строки

Чистый раствор sql:

set define on
undefine string
undefine delim
undefine nth
accept string prompt 'Enter the string: '
accept delim prompt 'Enter the delimiter: '
accept nth prompt 'Enter nth: '
select '&&string' as string,
       '&&delim' as delimiter, 
        &&nth||decode(&&nth,1,'st',2,'nd',3,'rd','th') as nth,
 substr('&&delim'||'&&string'||'&delim',
        instr('&&delim'||'&&string'||'&&delim', '&&delim', 1, &&nth ) + length('&&delim'),
        instr('&&delim'||'&&string'||'&&delim', '&&delim', 1, &&nth + 1 ) - instr('&&delim'||'&&string'||'&&delim', '&&delim', 1, &&nth ) - length('&&delim')
       ) as val from dual

/

0 голосов
/ 31 мая 2010

Не думаю, что что-то уже определено.

Существует несколько реализаций на orafaq , и я нашел это также.

...