线性扩展oracle表字段

问题描述 投票:1回答:1

我在oracle中有下表:

ID    field_1    field_2
1       1-5        1-5
1      20-30      55-65
2       1-8       10-17
2      66-72      80-86

我需要将此表转换为以下格式,其中field_1和field_2必须线性匹配:

   ID   field_1  field_2
    1      1       1
    1      2       2
    1      3       3
    1      4       4
    1      5       5
    1      20      55
    1      21      56
    1      22      57
    1      23      58
    1      24      59
    1      25      60
    1      26      61
    1      27      62
    1      28      63
    1      29      64
    1      30      65
    2      1       10
    2      2       11
    2      3       12
    2      4       13
    2      5       14
    2      6       15
    2      7       16
    2      8       17
    2      66      80
    2      67      81
    2      68      82
    2      69      83
    2      70      84
    2      71      85
    2      72      86

知道原始表包含成千上万条记录,这是最简单,最快的方法?

sql database string oracle recursive-query
1个回答
0
投票

一个选项使用递归查询。从11gR2开始,Oracle支持标准的递归公用表表达式,因此您可以执行以下操作:

with cte(id, field_1, field_2, max_field_1, max_field_2) as (
    select 
        id, 
        to_number(regexp_substr(field_1, '^\d+')), 
        to_number(regexp_substr(field_2, '^\d+')),
        to_number(regexp_substr(field_1, '\d+$')), 
        to_number(regexp_substr(field_2, '\d+$'))
    from mytable
    union all
    select
        id,
        field_1 + 1,
        field_2 + 1,
        max_field_1,
        max_field_2
    from cte
    where field_1 < max_field_1
)
select id, field_1, field_2 from cte order by id, field_1   

这假设同一行上的间隔始终具有相同的长度,如示例数据中所示。如果不是这种情况,您将解释如何处理。

Demo on DB Fiddle

ID | FIELD_1 | FIELD_2-:| ------:| ------:1 | 1 | 1个1 | 2 | 21 | 3 | 31 | 4 | 41 | 5 | 51 | 20 | 551 | 21 | 561 | 22 | 571 | 23 | 581 | 24 | 591 | 25 | 601 | 26 | 611 | 27 | 621 | 28 | 631 | 29 | 641 | 30 | 65岁2 | 1 | 102 | 2 | 112 | 3 | 122 | 4 | 132 | 5 | 142 | 6 | 152 | 7 | 162 | 8 | 172 | 66 | 802 | 67 | 812 | 68 | 822 | 69 | 832 | 70 | 842 | 71 | 852 | 72 | 86
© www.soinside.com 2019 - 2024. All rights reserved.