У меня есть столбец с разделенными значениями канала, такими как:
'23|12.1 | 450|30|9|78|82.5|92.1|120|185|52|11'
Я хочу проанализировать этот столбец для заполнения таблицы 12 соответствующими столбцами: month1, month2, month3... month12.
Таким образом, month1 будет иметь значение 23, month2 значение 12.1 и т.д...
Существует ли способ проанализировать его циклом или разделителем вместо того, чтобы иметь необходимость разделить одно значение во время с помощью substr?
Спасибо.
Вы можете использовать regexp_substr
(10g+):
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;