Sql 用字母替换数字的Oracle正则表达式

Sql 用字母替换数字的Oracle正则表达式,sql,oracle,replace,oracle12c,regexp-replace,Sql,Oracle,Replace,Oracle12c,Regexp Replace,我有一个只包含数字的字符串。 我需要用对应的字母表替换字符串中的所有数字,如下所示 0 -> A 1 -> B 2 -> C .. 9 -> J 我尝试了以下使用翻译和替换功能,对我来说效果很好 Forward : WITH T (ID) AS (SELECT '10005614827' FROM DUAL) SELECT ID, TRANSLATE(ID,'0123456789','ABCDEFGHIJ') "TRANSLAT

我有一个只包含数字的字符串。 我需要用对应的字母表替换字符串中的所有数字,如下所示

0   ->  A
1   ->  B
2   ->  C
..
9   ->  J
我尝试了以下使用翻译和替换功能,对我来说效果很好

Forward :
    WITH T (ID) AS (SELECT '10005614827' FROM DUAL)
    SELECT ID, TRANSLATE(ID,'0123456789','ABCDEFGHIJ')  "TRANSLATE",
           REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(ID,'0','A'),'1','B'),'2','C'),'3','D'),'4','E'),'5','F'),'6','G'),'7','H'),'8','I'),'9','J') "REPLACE"
    FROM T;

    Output:
        ID          TRANSLATE       REPLACE
        10005614827 BAAAFGBEICH     BAAAFGBEICH

Reverse:
    WITH T (ID) AS (SELECT 'BAAAFGBEICH' FROM DUAL)
    SELECT ID, TRANSLATE(ID,'ABCDEFGHIJ','0123456789')  "TRANSLATE",
           REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(ID,'A','0'),'B','1'),'C','2'),'D','3'),'E','4'),'F','5'),'G','6'),'H','7'),'I','8'),'J','9') "REPLACE"
    FROM T;

    Output:
        ID          TRANSLATE       REPLACE
        BAAAFGBEICH 10005614827     10005614827
有没有办法使用正则表达式来实现这一点

WITH T (ID) AS (SELECT '10005614827' FROM DUAL)
SELECT ID, REGEXP_REPLACE(ID,'[0-9]','[A-J]')
FROM T;

由于当前实现的局限性,在Oracle中不可能这样做

更具体地说,您不能将函数应用于匹配的值,您只能使用形式为\n的反向引用,其中n是1到9之间的数字

例如,您可以匹配每个数字,并重复它的次数,只要它等于

column example format a40
with t(id) as (select '10005614827' from dual)
select id,
regexp_replace(id,'(1)|(2)|(3)|(4)|(5)|(6)|(7)|(8)|(9)|(0)','\1\2\2\3\3\3\4\4\4\4\5\5\5\5\5\6\6\6\6\6\6\7\7\7\7\7\7\7\8\8\8\8\8\8\8\8\9\9\9\9\9\9\9\9\9') example          
from t
/


ID          EXAMPLE                                 
----------- ----------------------------------------
10005614827 1555556666661444488888888227777777      
1 row selected.
但在替换字符串时,无法对\n应用任何函数

另一方面,在Perl、Java、Scala等语言中。。。甚至在PowerShell和其他网站上也是可行的

来自Scala REPL的示例

scala>   val str = "10005614827"
str: String = 10005614827

scala>   // matching and converting each digit separately

scala>   "\\d".r.replaceAllIn(str, x => (x.group(0)(0)+17).toChar + "")
res0: String = BAAAFGBEICH

scala>   // marching and converting sequences of digits

scala>   "\\d+".r.replaceAllIn(str, x => x.group(0).map(x=>(x+17).toChar))
res1: String = BAAAFGBEICH
为了完成图片,模型解决方案只是为了好玩

SQL> with t(id) as (select '10005614827' from dual)
  2  select *
  3  from t
  4  model partition by (id) dimension by (0 i) measures (id result)
  5  rules iterate(10)
  6  (result[0] = replace(result[0],iteration_number,chr(ascii(iteration_number)+17)))
  7  /

ID                   I RESULT
----------- ---------- -----------
10005614827          0 BAAAFGBEICH
在这种情况下,
translate
是最好的方法。这正是这个函数的目的

PS.Scala等效于上述示例,其函数应用于匹配的值,而不是使用反向引用

"\\d".r.replaceAllIn(str, x => (x.group(0)*(x.group(0)(0)-48)))

使用translate函数我看不出问题。 例如,使用字符串编号“3389432543”,可以使用

         SELECT TRANSLATE('3389432543','0123456789','ABCDEFGHIJ')
         FROM DUAL;

你们读到原始帖子的第三句话了吗?谢谢@Y Wit博士的详细解释