我有以下示例表和数据:
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)。
答案 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'