我在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
知道原始表包含成千上万条记录,这是最简单,最快的方法?
一个选项使用递归查询。从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
这假设同一行上的间隔始终具有相同的长度,如示例数据中所示。如果不是这种情况,您将解释如何处理。
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