Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用REGEX_replace替换多个单词中特定位置的字符_Sql_Oracle_Oracle11g - Fatal编程技术网

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Özhan
2010FOO
应该变成
2009FOO
,那么
第四个字符减去1
应该表示为
由前四个字符组成的数字字符
…2020ARG呢?@BobJarvis
2020ARG
应该变成
2019ARG