gpt4 book ai didi

oracle - 将管道分隔的字符串解析为列?

转载 作者:行者123 更新时间:2023-12-03 13:55:57 26 4
gpt4 key购买 nike

我有一列带有管道分隔值,例如:

'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 一次分隔一个值?

谢谢。

最佳答案

您可以使用 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;

关于oracle - 将管道分隔的字符串解析为列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2942052/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com