zoukankan      html  css  js  c++  java
  • Oracle 10g 使用REGEXP_SUBSTR 分拆字符串 (转)

    SELECT l_count, REGEXP_SUBSTR('add, daddf, dsdf, asdfa, dsfasd, dsfad','[^,]+',1,l_count) AS NAME
      FROM dual
          ,(SELECT LEVEL l_count FROM DUAL CONNECT BY LEVEL<=100)
    WHERE l_count <=LENGTH('add, daddf, dsdf, asdfa, dsfasd, dsfad') - LENGTH(REPLACE('add, daddf, dsdf, asdfa, dsfasd, dsfad',','))+1

    查询结果为:
    lcount   name
    1            add
    2            daddf
    3            dsdf
    4            asdfa
    5            dsfasd
    6             dsfad

    一种奇特的字符串拆分方法

    create table t_test (id number, names varchar2(200));

    insert into t_test values (1,'a1,a2,a3,a4');
    insert into t_test values (2,'b1,b2,b3');
    insert into t_test values (3,'c1,c2,c3,c4,c5');

    目标输出:

    ID NAME
    --- ----
      1 a1
      1 a2
      1 a3
      1 a4
      2 b1
      2 b2
      2 b3
      3 c1
      3 c2
      3 c3
      3 c4
      3 c5

    常规做法:
    SELECT id
          ,REGEXP_SUBSTR(names,'[^,]+',1,l) AS NAME
      FROM t_test
          ,(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<=100)
    WHERE l <=LENGTH(names) - LENGTH(REPLACE(names,','))+1
    ORDER BY 1,2;

    下面这种写法(从ASKTOM看来的),很奇怪地在T2中可以看到T1的列(如果不用TABLE,CAST,MULTISET就不行), T1和T2两个集合之间没有任何连接条件, 看起来像Correlated Subquery, 但它是写在from的地方:

    SELECT id
          ,column_value
      FROM (SELECT id,','||names||',' names FROM t_test) t1     ----- 前后拼上逗号是为了下面定位拆分
          ,TABLE(CAST(MULTISET( SELECT SUBSTR (names            ----- 此处竟然可以看到t1.names
                                              ,INSTR (names, ',', 1, LEVEL  ) + 1
                                              ,INSTR (names, ',', 1, LEVEL+1) - INSTR (names, ',', 1, LEVEL) -1 
                                              ) 
                                  FROM DUAL
                                CONNECT BY LEVEL <= LENGTH(names)-LENGTH(REPLACE(names,',',''))-1 
                               )
                 AS SYS.ODCIVARCHAR2LIST ) ------ SYS.ODCIVARCHAR2LIST 可以换成任意一个TABLE OF VARCHAR2的嵌套表类型
                 ) t2
    ORDER BY 1,2;

  • 相关阅读:
    删除指定目录下的文件及子文件
    PHP简单实现“相关文章推荐”功能的方法(此方法不是自创)
    微信开发中自动回复(扫码、关注推事件)
    方式三(API方式)C++手动加载CLR运行托管程序(CLR Hosting)
    分享 N种方法使用C++调用C#.NET库
    redis 持久化之 RDB & AOF
    redis 慢查询、Pipeline
    redis 发布订阅、geo、bitmap、hyperloglog
    redis5.0 数据结构与命令
    Linux 下安装 redis5.0
  • 原文地址:https://www.cnblogs.com/toowang/p/6649917.html
Copyright © 2011-2022 走看看