Varchar列中的数字序列

时间:2017-03-12 22:15:53

标签: sql oracle

我有以下示例表和数据:

create table test_assignment_number
(
    assignment_id       number,
    assignment_number   varchar2(250),
    change_detail       varchar2(250)
);

insert into test_assignment_number (assignment_id, assignment_number, change_detail) values (1, '3807734', 'Initial Value');
insert into test_assignment_number (assignment_id, assignment_number, change_detail) values (2, '3807734', 'Some Minor Changes');
insert into test_assignment_number (assignment_id, assignment_number, change_detail) values (3, '3807734', 'More Minor Changes');
insert into test_assignment_number (assignment_id, assignment_number, change_detail) values (4, '3807734', 'Last Minor Change');
insert into test_assignment_number (assignment_id, assignment_number, change_detail) values (5, '3807734-2', 'Major Change');
insert into test_assignment_number (assignment_id, assignment_number, change_detail) values (6, '3807734-2', 'Minor Change to the Major Change');

select  *
from    test_assignment_number;

assignment_id   assignment_number   change_detail
-------------   -----------------   ----------------------------------
1               3807734             Initial Value
2               3807734             Some Minor Changes
3               3807734             More Minor Changes
4               3807734             Last Minor Change
5               3807734-2           Major Change
6               3807734-2           Minor Change to the Major Change                   

Assignment_Number列是从应用程序手动输入的,通过输入“-2”或“-3”进行重大更改。 我想通过使用函数以编程方式生成它。在一些SO帖子[1][2]的帮助下,这是我到目前为止所得到的:

select  assignment_number||'-'||sequence_num new_assignment_number
from   (select  max(regexp_substr(assignment_number, '[^-]+',1,1)) assignment_number -- gets the base Assignment_Number
            ,   max(regexp_substr(assignment_number, '[^-]+$'))+1  sequence_num      -- gets the next sequence 
        from    test_assignment_number
        where   regexp_substr(assignment_number, '[^-]+$') <> assignment_number);

结果:

NEW_ASSIGNMENT_NUMBER
---------------------
3807734-3

然而,我想知道是否有更好或更简单的方法来做到这一点。 哪些实例/事件可能导致此SQL代码的行为不同并产生不需要的输出?

要考虑的一些脚注: 我不能使用序列,因为其他一些员工有其他分配号码(例如9999999-10)。 我不能为序列号添加另一个单独的列,因为实际的表是Oracle Priopietary(Oracle EBS)。

1 个答案:

答案 0 :(得分:0)

我会有一个名为assignment_version的新列(或适当的东西)。这样,assignment_number将保留赋值号码;它的意思不会改变。此外,你不需要做substringing或regexing和其他这样的恶作剧,例如只获得assignment_number。根据您的示例,您的新列将包含2或3。如果您的assignment_version必须是顺序的,那么很容易通过以下方式获取最新的:

select max(assignment_version) 
from test_assignment_number
where assingnment_number = '3807734'