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博士的详细解释