精华内容
下载资源
问答
  • 求Sql话语将一行拆分成多行
    2021-05-01 08:49:48

    SQL codewith cte as(

    select '10001' BeginResId, '10005' EndResId, 5 count, 100 price from dual

    union all

    select '10007', '10012', 6, 200 from dual

    )

    select beginresid+level-1 resid,price from cte

    connect by level<=count and prior price=price and

    prior dbms_random.value is not null;

    结果为:

    RESID PRICE

    ---------------------- ----------------------

    10001 100

    10002 100

    10003 100

    10004 100

    10005 100

    10007 200

    10008 200

    10009 200

    10010 200

    10011 200

    10012 200

    11 rows selected

    更多相关内容
  • 工作和学习中常常会遇到一行要分割成多行数据的情况,在此整理一下做下对比。 单行拆分 如果表数据只有一行,则可以直接在原表上直接使用connect by+正则的方法,比如: select regexp_substr('444.555.666', '[^...
  • Oracle 一行拆分多行

    2021-05-01 08:49:49
    SQL>colsingle_elementfora15SQL>SQL>withilvas2(selectstrasorig_str,3‘,‘||str||‘,‘asmod_str,41asstart_pos,5length(str)asend_pos,6...

    SQL> col single_element for a15

    SQL>

    SQL> with ilv as

    2   (select str as orig_str,

    3           ‘,‘ || str || ‘,‘ as mod_str,

    4           1 as start_pos,

    5           length(str) as end_pos,

    6           (length(str) - length(replace(str, ‘,‘))) + 1 as element_count,

    7           0 as element_no,

    8           rownum as rn

    9      from t)

    10  select orig_str as original_string,

    11         substr(mod_str, start_pos, end_pos - start_pos) as single_element,

    12         element_no,

    13         element_count

    14    from (select *

    15            from ilv

    16           model partition by(rn, orig_str, mod_str)

    17                 dimension by(element_no)

    18                 measures(start_pos, end_pos, element_count)

    19                 rules iterate(2000)

    20                    until(iteration_number + 1 = element_count[0])(

    21                        start_pos[iteration_number + 1] = instr(cv(mod_str), ‘,‘, 1, cv(element_no)) + 1,

    22                        end_pos[iteration_number + 1] = instr(cv(mod_str), ‘,‘, 1, cv(element_no) + 1)

    23                    )

    24          )

    25   where element_no != 0

    26   order by mod_str, element_no;

    ORIGINAL_STRING                SINGLE_ELEMENT  ELEMENT_NO ELEMENT_COUNT

    ------------------------------ --------------- ---------- -------------

    X,Y,Z                          X                        1

    X,Y,Z                          Y                        2

    X,Y,Z                          Z                        3

    XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG XXX                      1

    XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG Y                        2

    XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG ZZ                       3

    XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG AAAAA                    4

    XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG B                        5

    XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG CCC                      6

    XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG D                        7

    XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG E                        8

    XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG F                        9

    XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG GGG                     10

    13 rows selected

    SQL>

    展开全文
  • DROP TABLE TEST PURGE ;CREATE TABLE TEST (po_number VARCHAR2(16),product_name VARCHAR2(64),quantity NUMBER);INSERT INTO TEST VALUES('CJ201300048','TP-LINK网络交换机TP-1024DT ', 2);...

    DROP TABLE TEST PURGE ;

    CREATE TABLE TEST (po_number VARCHAR2(16),product_name VARCHAR2(64),quantity NUMBER);

    INSERT INTO TEST VALUES('CJ201300048','TP-LINK网络交换机TP-1024DT ', 2);

    INSERT INTO TEST VALUES('CJ201300049','汉邦4路/特顿 600线半球/希捷硬盘500G',1);

    INSERT INTO TEST VALUES('CJ201300050','TP LINK无线路由器DAP-1353',2);

    INSERT INTO TEST VALUES('CJ201300060','科密电子门禁MF850D',1);

    commit;

    WITH a AS (SELECT ROWNUM rn FROM dual CONNECT BY ROWNUM <= (SELECT MAX(t.quantity) FROM TEST t))

    SELECT t1.po_number,t1.product_name,1 quantity FROM TEST t1 LEFT JOIN a ON t1.quantity >= a.rn

    SQL> WITH a AS (SELECT ROWNUM rn FROM dual CONNECT BY ROWNUM <= (SELECT MAX(t.quantity) FROM TEST t))

    2 SELECT t1.po_number,t1.product_name,1 quantity FROM TEST t1 LEFT JOIN a ON t1.quantity >= a.rn

    3 ;

    PO_NUMBER PRODUCT_NAME QUANTITY

    ---------------- ---------------------------------------------------------------- ----------

    CJ201300050 TP LINK无线路由器DAP-1353 1

    CJ201300050 TP LINK无线路由器DAP-1353 1

    CJ201300048 TP-LINK网络交换机TP-1024DT 1

    CJ201300048 TP-LINK网络交换机TP-1024DT 1

    CJ201300060 科密电子门禁MF850D 1

    CJ201300049 汉邦4路/特顿 600线半球/希捷硬盘500G 1

    6 rows selected

    SQL>

    展开全文
  • Oracle 一行字符串拆分多行

    千次阅读 2020-12-03 23:23:40
    从此结果可知数据是先生后,然后使用where条件筛选 2. 多条数据拆分 1、方法1 --正确 with z_branch as( select 'BR1001' brid, 'BR1001.BR1002.BR1003' br_level from dual union all select 'BR1002' brid, 'BR...

    测试数据

    --单条数据
    with z_branch as(
      select 'BR1001' brid, 'BR1001.BR1002.BR1003' br_level from dual
    )
    select * from z_branch;
    

    在这里插入图片描述

    --多条数据
    with z_branch as(
      select 'BR1001' brid, 'BR1001.BR1002.BR1003' br_level from dual
      union all
      select 'BR1002' brid, 'BR1002.BR1003' br_level from dual
      union all
      select 'BR1003' brid, 'BR1001.BR1003' br_level from dual
    )
    select * from z_branch;
    

    在这里插入图片描述

    1. 单个字符串或单条数据拆分

    如果表中只有单行数据或拆分单个字符串,可以使用。网上大部分讲的都是单条数据的拆分,如果是多条数据拆分则不适用。

    with z_branch as(
      select 'BR1001' brid, 'BR1001.BR1002.BR1003' br_level from dual
    )
    select level, 
           regexp_count(br_level, '\.') + 1,
           regexp_substr(br_level, '[^.]+', 1, level) s_brid
      from z_branch t
    connect by level <= regexp_count(br_level, '\.') + 1;
    

    regexp_count(br_level, ‘.’) 统计字符.的个数
    regexp_substr(br_level, ‘[^.]+’, 1, level) br_level字段从位置1开始使用字符.拆分,level指取拆分后第level个字符串

    with z_branch as(
      select 'BR1001' brid, 'BR1001.BR1002.BR1003' br_level from dual
    )
    select level,
           length(brid) - length(replace(brid, '.', '')) + 1,
           regexp_substr(br_level, '[^.]+', 1, level) s_brid
      from z_branch t
    connect by level <= length(br_level) - length(replace(br_level, '.', '')) + 1;
    

    在这里插入图片描述
    错误示例

    --结果不符合预期
    with z_branch as(
      select 'BR1001' brid, 'BR1001.BR1002.BR1003' br_level from dual
      union all
      select 'BR1002' brid, 'BR1002.BR1003' br_level from dual
      union all
      select 'BR1003' brid, 'BR1001.BR1003' br_level from dual
    )
    select brid,
           level, 
           regexp_count(br_level, '\.') + 1,
           regexp_substr(br_level, '[^.]+', 1, level) s_brid
      from z_branch t
    connect by level <= regexp_count(br_level, '\.') + 1;
    

    在这里插入图片描述

    -- 不符合预期
    with z_branch as(
      select 'BR1001' brid, 'BR1001.BR1002.BR1003' br_level from dual
      union all
      select 'BR1002' brid, 'BR1002.BR1003' br_level from dual
      union all
      select 'BR1003' brid, 'BR1001.BR1003' br_level from dual
    )
    select brid,
           level, 
           regexp_count(br_level, '\.') + 1,
           regexp_substr(br_level, '[^.]+', 1, level) s_brid
      from z_branch t
     where t.brid = 'BR1001'
    connect by level <= regexp_count(br_level, '\.') + 1;
    

    在这里插入图片描述
    从此结果可知数据是先生成后,然后使用where条件筛选

    2. 多条数据拆分

    1、方法1

    --正确
    with z_branch as(
      select 'BR1001' brid, 'BR1001.BR1002.BR1003' br_level from dual
      union all
      select 'BR1002' brid, 'BR1002.BR1003' br_level from dual
      union all
      select 'BR1003' brid, 'BR1001.BR1003' br_level from dual
    )
    select brid,
           level, 
           regexp_count(br_level, '\.') + 1 as row_cnt,
           regexp_substr(br_level, '[^.]+', 1, level) as s_brid
      from z_branch t
    connect by level <= regexp_count(br_level, '\.') + 1
       and t.brid = prior t.brid
       and prior dbms_random.value > 0;
    

    在这里插入图片描述

    2、方法2

    --正确 借助伪列
    with z_branch as(
      select 'BR1001' brid, 'BR1001.BR1002.BR1003' br_level from dual
      union all
      select 'BR1002' brid, 'BR1002.BR1003' br_level from dual
      union all
      select 'BR1003' brid, 'BR1001.BR1003' br_level from dual
    ),
    z_level as(
      select level lv from dual connect by level < 10
    ) 
    select t.brid,
           a.lv, 
           regexp_count(t.br_level, '\.') + 1 as row_cnt,
           regexp_substr(t.br_level, '[^.]+', 1, a.lv) as s_brid
      from z_branch t
     inner join z_level a
        on a.lv <= regexp_count(t.br_level, '\.') + 1;
    

    在这里插入图片描述
    注意:创建的伪列行数,要大于其中字符串拆分后数量最大值,本示例中字符串拆分后最大值是3,所以只要伪列行数大于3即可。

    展开全文
  • oracle 一行拆分多行

    千次阅读 2019-05-23 16:09:01
    select regexp_substr('aaa,bbb,ccc,ddd,eee','[^,]+',1,LEVEL,'i') from dual CONNECT BY LEVEL <= LENGTH('aaa,bbb,ccc,ddd,eee') - LENGTH(REGEXP_REPLACE('aaa,bbb,ccc,ddd,eee', ',', '')) + 1 ...
  • 在项目实施阶段,遇到这样的情况,原始设计是将附件的地址存放在个单元格中,这个单元格后期务必要改为clob类型,最后根据附件地址取值时,需要将地址根据 特殊标识 来拆分。确实比较恶心 ,但是没法,附件涉及到...
  • ORACLE 一行数据拆分多行

    千次阅读 2020-04-13 11:23:55
    例: select regexp_substr('a,b,c,d,e','[^,]+',1,LEVEL,'i') from dual CONNECT BY LEVEL <= LENGTH('a,b,c,d,e') - LENGTH(REGEXP_REPLACE('a,b,c,d,e', ',', '')) + 1; ...
  • Oracle 单字段拆分成多行

    万次阅读 多人点赞 2017-05-08 21:01:41
    方法SELECT DISTINCT STUID, REGEXP_SUBSTR (STUNAME, '[^,]+', 1, LEVEL) STUNAME, STUSEX FROM T_STU CONNECT BY LEVEL (STUNAME) - LENGTH (REPLACE(STUNAME, ',', '')) + 1 ORDER BY
  • 1.聚合函数法。 /*TYPE*/ create or replace type strcat_type as object ( currentstr varchar...(oracle 11gr2及以上版本) 例: select id,listagg(name,',') within group(order by id) from t_avg t group by id;
  • oracle根据分隔符将一行拆分多行

    千次阅读 2018-04-03 11:44:44
    --oracle根据分隔符将一行拆分多行 with tmp as --临时数据集 (select 1 id, 'one,two,three' names from dual union all select 2 id, 'four,five,six' names from dual union all select 3 id, 'seven,...
  • SELECT REGEXP_SUBSTR ('1,2,3', '[^,]+', 1,rownum) from dual connect by rownum<=LENGTH ('1,2,3') - LENGTH (regexp_replace('1,2,3', ',', ''))+1;
  • orcal根据分号把一行拆分多行显示

    千次阅读 2020-07-27 11:23:05
    近期开发块需求遇到之前用分号拼接保留在个字段的值需要拆分出来分表保存,所以想了下实现方法 数据如下: 实现效果如下: 单条处理sql: select a.id, a.carcoopercode, substr2(regexp_substr(a....
  • 句话实现字段拆分成多行

    千次阅读 2021-05-06 02:05:04
    SQL里没有提供集合对象,不能提供根据拆分后的字符串集合把一行变成多行的操作。解决这个问题的思路就是先求出字段拆分后的最大字符串个数M,然后构造一个M行1列的临时表T2,其列名为lv,则各行lv值分别为1,2,……,M...
  • oracle 某列存儲的值是有逗號的字符串,希望通過逗號分隔開來顯示多行。sql,有預期結果,有項目實戰。
  • 如果不限制,则连接从句多行也不会给出想要的输出。对于单个分隔字符串,请参阅要在表中拆分分隔字符串,请参阅除了正则表达式,其他一些替代办法是:XMLTable模型条款设置SQL>CREATETABLEt(2...
  • 在处理数据过程中,常会遇到将条数据拆分成多条,比如个人的地址信息中,可能有多条地址,既有家庭地址也有工作地址,还有电话信息等等类似的情况,实际使用数据的时候又需要分开处理,这个时候就需要将这条...
  • 【问题】 表: xh kc 1 语文,数学,英语 2 政治,历史,地理 3 地理,语文 4 地理,数学 ...Oracle 中可以使用层次查询语句结合子查询或随机数完成,这里给出两种写法: 写法 1: SELECT xh,REG...
  • Oracle 分割字符串 返回多行数据
  • oracle一行拆分多行

    千次阅读 2011-10-12 00:51:53
    客户的业务涉及大量的图片信息...坑爹的是,图片在数据库中的存放路径SQL*LOADER不能直接加载,需要进行记录拆分。\01\01--0002\04-01-01-0002-003-&lt;0001-0007&gt;.jpg;\01\01--0003\04-01-01-0003-007...
  • 示例: SELECT REGEXP_SUBSTR('1,2,3,4,5,6,7,8,9,10', '[^,]+', 1, LEVEL, 'i') AS STR FROM DUAL CONNECT BY LEVEL <=LENGTH('1,2,3,4,5,6,7,8,9,10') - LENGTH(REGEXP_REPLACE('1,2,3,4,5,6,7,8,9,10',',','...
  • oracle根据个字段拆分成多行显示

    千次阅读 2019-08-06 11:12:08
    根据,为依据进行拆分 原数据为 A 1,2,3 B 1,66,88 最后得到的数据为: A1 A2 A3 B1 B66 B88 如果是10G及以前的版本,可以用如下SQL: with t as ( select 'A' id,'1,2,3' data from dual union all select 'B' id,'...
  • oracle 根据逗号拆分字段内容转成多行
  • 1. 针对Oracle个字段对应多个字段,将行拆分成多行 def one_to_many(): start_time = time.time() conn = cx_Oracle.connect('ly_cs', 'liangyue_cs_1Q#', 'liangyue') sql01 = 'select * from liangyue_cs'...
  • SQL语句用with将列分割多列存为临时表,再将多行某个字段拼接合并为一行

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,820
精华内容 1,528
关键字:

oracle一行拆分成多行