Oracle CONNECT BY根据特定字符拆分字符串

Oracle CONNECT BY根据特定字符拆分字符串

1、一行

SELECT T.ID, REGEXP_SUBSTR(T.VALS, '[^,]+', 1, LEVEL) AS VAL
  FROM (SELECT '101' ID, 'A,B' VALS FROM DUAL) T
CONNECT BY LEVEL <= REGEXP_COUNT(T.VALS, '[^,]+');

2、多行
2-1、如果ID唯一不重复:

SELECT T.ID, REGEXP_SUBSTR(T.VALS, '[^,]+', 1, LEVEL) AS VAL
  FROM (
          SELECT '101' ID, 'A,B' VALS FROM DUAL UNION ALL
          SELECT '102' ID, 'X,X' VALS FROM DUAL
        ) T
CONNECT BY LEVEL <= REGEXP_COUNT(T.VALS, '[^,]+')
          AND PRIOR T.ID = T.ID
          AND PRIOR DBMS_RANDOM.VALUE() IS NOT NULL;

2-2、如果ID有重复:

SELECT T.RM, T.ID, REGEXP_SUBSTR(T.VALS, '[^,]+', 1, LEVEL) AS VAL
  FROM (SELECT ROWNUM RM, A.* FROM 
            (
              SELECT '101' ID, 'A,B' VALS FROM DUAL UNION ALL
              SELECT '101' ID, 'C,D' VALS FROM DUAL UNION ALL
              SELECT '102' ID, 'X,X' VALS FROM DUAL
            ) A
        ) T
CONNECT BY LEVEL <= REGEXP_COUNT(T.VALS, '[^,]+')
          AND PRIOR T.RM = T.RM 
          AND PRIOR DBMS_RANDOM.VALUE() IS NOT NULL;

3、Kingbase数据库 DBMS_RANDOM.VALUE() -> random()

SELECT T.RM, T.ID, REGEXP_SUBSTR(T.VALS, '[^,]+', 1, LEVEL) AS VAL
  FROM (SELECT ROWNUM RM, A.* FROM 
            (
              SELECT '101' ID, 'A,B' VALS FROM DUAL UNION ALL
              SELECT '101' ID, 'C,D' VALS FROM DUAL UNION ALL
              SELECT '102' ID, 'X,X' VALS FROM DUAL
            ) A
        ) T
CONNECT BY LEVEL <= REGEXP_COUNT(T.VALS, '[^,]+')
          AND PRIOR T.RM = T.RM 
          AND PRIOR random() IS NOT NULL;

经典参考:
https://blog.csdn.net/Hehuyi_In/article/details/104590160/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值