如何在oracle中增加两列的差值

holgip5t  于 2023-06-22  发布在  Oracle
关注(0)|答案(1)|浏览(123)

我有一个数据表。有两列,一列是开始编号,另一列是结束编号。从这两列中,我如何生成多行。
我的数据如下
| 账号|开始编号|结束编号|
| - -----|- -----|- -----|
| 九八七六|05584| 05587|
| 六七八九|三四五六|三四六○|
我需要将上述数据转换为以下结构
| 账号|开始编号|结束编号|
| - -----|- -----|- -----|
| 九八七六|05584||
| 九八七六|05585||
| 九八七六|05586||
| 九八七六|05587||
| 六七八九|三四五六||
| 六七八九|三四五七||
| 六七八九|三四五八||
| 六七八九|三四五九||
| 六七八九|三四六○||
我有数百万这样的数据。

hpcdzsge

hpcdzsge1#

这就是我如何理解这个问题,基于你的问题和删除的答案中的评论。对于那些没有足够声誉的读者来说,它说:
如果我的数据在一行中是account_number(4567),start_number(234,567,456),end_number(236,568,458),那么我的步骤或查询是什么?
样本数据:

SQL> select * from test;

ACCOUNT_NUMBER START_NUMBER    END_NUMBER
-------------- --------------- -----------
          4567 234,567,456     236,568,458
          9876 05584           05587
           777 33,65,45        ,,47

由于开始和结束数字列中可能有多个值,因此必须将每个值拆分为行(这就是代码中temp CTE所做的),然后使用行生成器技术之一在匹配的数字值之间生成值。

SQL> with temp as
  2    (select
  3       account_number,
  4       regexp_substr(start_number, '(.*?)(,|$)', 1, column_value, null, 1) start_number,
  5       regexp_substr(end_number  , '(.*?)(,|$)', 1, column_value, null, 1) end_number,
  6       column_value lvl
  7    from test cross join
  8      table(cast(multiset(select level from dual
  9                          connect by level <= regexp_count(start_number, ',') + 1
 10                         ) as sys.odcinumberlist))
 11    )
 12  select account_number,
 13    lpad(to_number(start_number) + column_value - 1, length(start_number), '0') start_number
 14  from temp cross join
 15    table(cast(multiset(select level from dual
 16                        connect by level <= to_number(end_number) - to_number(start_number) + 1
 17                       ) as sys.odcinumberlist))
 18  order by account_number, lvl, column_value;

结果:

ACCOUNT_NUMBER START_NUMBER
-------------- ---------------
           777 33
           777 65
           777 45
           777 46
           777 47
          4567 234
          4567 235
          4567 236
          4567 567
          4567 568
          4567 456
          4567 457
          4567 458
          9876 05584
          9876 05585
          9876 05586
          9876 05587

17 rows selected.

SQL>

相关问题