PL SQL-仅顺序更新varchar中的数字

PL SQL-仅顺序更新varchar中的数字,sql,oracle,Sql,Oracle,我有一个数据为varchar的现有表。这些代码是由我以外的人预先确定的,因此我无法更改它们 每年我都需要运行一个insert语句,该语句获取上一年的数据/代码,并将它们与新的一年一起滚动 2019年使用的现有数据示例:代码A19、代码B19、代码19、代码E19等 我需要能够做的是依次向每个代码添加+1以将其更改为新的一年(在本例中为2020年):CodeA20、CodeB20、Code20、CodeE20等 我试着搜索正则表达式来实现这一点,但我自己却没有运气。我似乎找不到一种方法来分离要添加

我有一个数据为varchar的现有表。这些代码是由我以外的人预先确定的,因此我无法更改它们

每年我都需要运行一个insert语句,该语句获取上一年的数据/代码,并将它们与新的一年一起滚动

2019年使用的现有数据示例:代码A19、代码B19、代码19、代码E19等

我需要能够做的是依次向每个代码添加+1以将其更改为新的一年(在本例中为2020年):CodeA20、CodeB20、Code20、CodeE20等

我试着搜索正则表达式来实现这一点,但我自己却没有运气。我似乎找不到一种方法来分离要添加到数字序列中的混合值

oracledb,plsql,使用sqldev


谢谢

最简单的方法可能是
replace

update t
    set code = replace(code, '19', '20')
    where code like '%19';
这假设代码没有数字


注意:如果要更改现有值,这似乎是一个非常奇怪的数据模型。

最简单的方法可能是
replace

update t
    set code = replace(code, '19', '20')
    where code like '%19';
这假设代码没有数字


注意:如果要更改现有值,这似乎是一个非常奇怪的数据模型。

您可以使用正则表达式查找以上一年结尾的值,提取剩余部分,并在新的一年中继续;使用硬编码值,例如:

select regexp_replace(code, '(.*)19$', '\1') as root,
       regexp_replace(code, '(.*)19$', '\1') || '20' as result
from your_table
where regexp_like(code, '(.*)19$');
或者基于当前的实际年份,假设您在新的一年中运行它:

select regexp_replace(code, '(.*)' || to_char(add_months(sysdate, -12), 'RR') || '$', '\1') as root,
       regexp_replace(code, '(.*)' || to_char(add_months(sysdate, -12), 'RR') || '$', '\1')
         || to_char(sysdate, 'RR') as result
from your_table
where regexp_like(code, '(.*)' || to_char(add_months(sysdate, -12), 'RR') || '$');
这两个项目目前都获得:

ROOT       RESULT    
---------- ----------
CodeA      CodeA20   
CodeB      CodeB20   
CodeC      CodeC20   
CodeE      CodeE20   
然后将其用作插入:

insert into your_table (code)
select regexp_replace(code, '(.*)' || to_char(add_months(sysdate, -12), 'RR') || '$', '\1')
         || to_char(sysdate, 'RR') as result
from your_table
where regexp_like(code, '(.*)' || to_char(add_months(sysdate, -12), 'RR') || '$');

regexp模式有点幼稚,但适用于示例;如果您有更复杂的值,可能会出错,或者只想匹配某些前缀,那么您需要对其进行调整

如果最后的数字是两位数年份,那么您可以简化为使用
replace
而不是
regexp\u replace
,正如Gordon所建议的:

insert into your_table (code)
select replace(code, to_char(add_months(sysdate, -12), 'RR'), to_char(sysdate, 'RR')) as result
from your_table
where code like to_char(add_months(sysdate, -12), '"%"RR');


。。。但这可能是一个很大的“如果”。

您可以使用正则表达式来查找以上一年结尾的值,提取剩余部分,并在新的一年中继续执行;使用硬编码值,例如:

select regexp_replace(code, '(.*)19$', '\1') as root,
       regexp_replace(code, '(.*)19$', '\1') || '20' as result
from your_table
where regexp_like(code, '(.*)19$');
或者基于当前的实际年份,假设您在新的一年中运行它:

select regexp_replace(code, '(.*)' || to_char(add_months(sysdate, -12), 'RR') || '$', '\1') as root,
       regexp_replace(code, '(.*)' || to_char(add_months(sysdate, -12), 'RR') || '$', '\1')
         || to_char(sysdate, 'RR') as result
from your_table
where regexp_like(code, '(.*)' || to_char(add_months(sysdate, -12), 'RR') || '$');
这两个项目目前都获得:

ROOT       RESULT    
---------- ----------
CodeA      CodeA20   
CodeB      CodeB20   
CodeC      CodeC20   
CodeE      CodeE20   
然后将其用作插入:

insert into your_table (code)
select regexp_replace(code, '(.*)' || to_char(add_months(sysdate, -12), 'RR') || '$', '\1')
         || to_char(sysdate, 'RR') as result
from your_table
where regexp_like(code, '(.*)' || to_char(add_months(sysdate, -12), 'RR') || '$');

regexp模式有点幼稚,但适用于示例;如果您有更复杂的值,可能会出错,或者只想匹配某些前缀,那么您需要对其进行调整

如果最后的数字是两位数年份,那么您可以简化为使用
replace
而不是
regexp\u replace
,正如Gordon所建议的:

insert into your_table (code)
select replace(code, to_char(add_months(sysdate, -12), 'RR'), to_char(sysdate, 'RR')) as result
from your_table
where code like to_char(add_months(sysdate, -12), '"%"RR');


。。。但这可能是一个很大的“如果”。

您想选择代码以19结尾的所有行,然后再次插入代码以20结尾的行吗?您想选择代码以19结尾的所有行,然后再次插入代码以20结尾的行吗?感谢所有提供帮助的人。我想我需要更清楚,代码类型不是单词code,这只是字母数字的例子。其中有数百个不同名称的代码,例如:abdcef19 bedef19 aofdjkle19 asljenvidke19,因此使用regexp替换单个alpha值是行不通的。唯一始终保持不变的变量是显示为19(2019年)、20(2020年)等的年份。有什么想法吗?我正试图为我自己和我可能会把它交给的任何人证明这一点。Alex,你的替换语句遇到了一个我起初没有注意到的问题,我的大约13个“代码”也有一年后的字符,例如:ABCD19 vs ABCD19Q1我没有假设“代码”在值中,但我选择了“代码”作为虚拟列名,这可能会让人困惑。如果您仍然只有年份和季度数字,那么您可以安全地替换所有两位数,那么我认为只需将最后一个术语从
'“%”“RR”
更改为
'“%”“RR”%”
。或者,你也可以使用正则表达式进行更高级的检查,包括并保留四分之一部分,但听起来似乎没有必要。@ScottReschke像YY,但将Y2K问题转移到了世纪中叶。@WilliamRobertson-我们必须先度过2039年的时代*8-)感谢所有提供帮助的人。我想我需要更清楚,代码类型不是单词code,这只是字母数字的例子。其中有数百个不同名称的代码,例如:abdcef19 bedef19 aofdjkle19 asljenvidke19,因此使用regexp替换单个alpha值是行不通的。唯一始终保持不变的变量是显示为19(2019年)、20(2020年)等的年份。有什么想法吗?我正试图为我自己和我可能会把它交给的任何人证明这一点。Alex,你的替换语句遇到了一个我起初没有注意到的问题,我的大约13个“代码”也有一年后的字符,例如:ABCD19 vs ABCD19Q1我没有假设“代码”在值中,但我选择了“代码”作为虚拟列名,这可能会让人困惑。如果您仍然只有年份和季度数字,那么您可以安全地替换所有两位数,那么我认为只需将最后一个术语从
'“%”“RR”
更改为
'“%”“RR”%”
。或者,你也可以使用正则表达式进行更高级的检查,包括并保留四分之一部分,但听起来似乎没有必要。@ScottReschke像YY,但将Y2K问题转移到了世纪中叶。@WilliamRobertson-我们必须先从2039年的时代alypse中幸存下来*8-)