oracle 实现行列转换(使用split去逗号)

本文介绍了如何在Oracle数据库中使用REGEXP_SUBSTR函数和CONNECT BY语句将逗号分隔的字符串转换为多行。通过示例展示了如何从包含逗号分隔值的列中提取数据,并提供了创建自定义函数fn_split来实现更复杂的分隔符转换。此外,还给出了测试用例,展示如何使用该函数处理不同分隔符的字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.针对 ‘1’,‘2’,‘3’,‘4’,‘5’(逗号在字符串外面)

SQL>SELECT COLUMN_VALUE FROM TABLE(SYS.ODCIVARCHAR2LIST(‘1’,‘2’,‘3’,‘4’,‘5’));

COLUMN_VALUE

1
2
3
4
5

SQL> select regexp_substr(‘1,2,3,4,5’, ‘[^,]+’, 1, rownum) as acolumn
from dual
connect by rownum <=
length(‘1,2,3,4,5’) - length(replace(‘1,2,3,4,5’, ‘,’)) + 1;

REGEXP_SUBSTR(‘1,2,3,4,5’,’[^,

1
2
3
4
5

语句举例:
select t.orderidentity,
t.orderhiscode1,
regexp_substr(t.orderhiscode2, ‘[^;]+’, 1, LEVEL)
from (select o.orderidentity, o.orderhiscode1, o.orderhiscode2
from t_order o
where o.orderidentity = 48003313317015632) t
connect by regexp_substr(t.orderhiscode2, ‘[^;]+’, 1, LEVEL) is not null

3.使用函数

CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);

CREATE OR REPLACE FUNCTION fn_split (p_str IN CLOB, p_delimiter IN VARCHAR2)
RETURN ty_str_split
IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2 (4000);
str_split ty_str_split := ty_str_split ();
BEGIN
len := LENGTH (p_str);
len1 := LENGTH (p_delimiter);

WHILE j < len
LOOP
j := INSTR (p_str, p_delimiter, i);

IF j = 0
THEN
    j := len;
    str := SUBSTR (p_str, i);
    str_split.EXTEND;
    str_split (str_split.COUNT) := str;

    IF i >= len
    THEN
      EXIT;
    END IF;
ELSE
    str := SUBSTR (p_str, i, j - i);
    i := j + len1;
    str_split.EXTEND;
    str_split (str_split.COUNT) := str;
END IF;

END LOOP;

RETURN str_split;
END fn_split;

测试:

SQL> select * from table(fn_split(‘1,2,3,4,5’,’,’)); --第二个单引号中是前面字符串中需要被分隔的字符

COLUMN_VALUE -------------------------------------------------------------------------------- 1 2 3 4 5

SQL> select * from table(fn_split(‘1,2,3,4。5’,’。’));

COLUMN_VALUE -------------------------------------------------------------------------------- 1,2,3,4 5

SQL>
————————————————
原文链接:https://blog.csdn.net/wanglilin/article/details/7231712

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值