Sql 如何使用REGEX_replace替换多个单词中特定位置的字符
我有一个类似的问题:Sql 如何使用REGEX_replace替换多个单词中特定位置的字符,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有一个类似的问题: SELECT YEAR_CODE FROM YEAR_CODES 它会返回几个记录:通常为1,但有时为2或3。返回的记录如下所示:2018FOO,2019BAR 我需要得到匹配的上一年返回的代码。例如: 2018FOO变为2017FOO 2019条变为2018条 寻找类似于: REGEX_REPLACE(SELECT YEAR_CODE FROM YEAR_CODES, 4th character, 4th character minus 1) 您可以使用字符串操作
SELECT YEAR_CODE FROM YEAR_CODES
它会返回几个记录:通常为1,但有时为2或3。返回的记录如下所示:2018FOO
,2019BAR
我需要得到匹配的上一年返回的代码。例如:
- 2018FOO变为2017FOO
- 2019条变为2018条
REGEX_REPLACE(SELECT YEAR_CODE FROM YEAR_CODES, 4th character, 4th character minus 1)
您可以使用字符串操作:
with c as (
<your query here>
)
select
from year_code yc
where to_number(substr(yc.code, 1, 4)) = to_number(substr(c.code)) - 1 and
substr(yc.code, 5) = substr(c.code, 5)
使用c作为(
)
选择
从年份代码yc开始
其中to_编号(substr(yc.code,1,4))=to_编号(substr(c.code))-1和
substr(yc.code,5)=substr(c.code,5)
您不需要regexp\u replace()
,使用substr()
字符串运算符和concat()
函数(或串联运算符|
)就足够了:
with year_codes(year_code) as
(
select '2018FOO' from dual union all
select '2019BAR' from dual
)
select concat(substr(year_code,1,4) - 1,substr(year_code,-3)) as year_code
from year_codes;
YEAR_CODE
---------
2017FOO
2018BAR
到_number()
转换是多余的,由于Oracle隐式地将字符串视为一个完全由数字组成的数字,用于算术运算。如果您有2010FOO
?@BarbarosÖzhan2010FOO
应该变成2009FOO
,那么第四个字符减去1
应该表示为由前四个字符组成的数字字符
…2020ARG呢?@BobJarvis2020ARG
应该变成2019ARG