在Oracle中数据转换问题,如何批量将字符串中的字母转化为特定数字

遇到一个数据格式问题

这样一张表↓
id str
1 AB
2 CC
3 CD
4 CF

希望得到的结果
id str
1 12
2 33
3 34
4 35

虽然我知道可以使用 replace 函数,但是在假设 26个字母都有的情况以及多次遇到这样的数据处理问题
最优解是我每次都要写 26个 replace嵌套吗?
有没有其他方案呢,请讲解一下

如果数据比较多,建议建一个表进行转换,表里面包含2个字段,第一列id(1-26),第二列字母('A'-'Z')。

可以用translate函数

select translate('aaabbddehhiijjaabb','abcdefghij','1234567890') from dual

img

第1个参数为原字符串,第2个参数和第3个参数,按字符位置匹配对应的转换关系,比如a转换成1,b转换成2。
但是,很明显,数字只有10个,当然也可以用其他的字符,但那样就无法一眼识别原字符了,
而且你题目中举的例子,如果是 26,那么它是2代表的字母和6代表的字母拼接?还是第26个字母呢?
如果是纯粹的想把字母转换成数字,不考虑歧义问题,可以直接用ascii函数获得这个字符的ascii码

select ascii('a'),ascii('b'),ascii('z') from dual;

img


select 的函数只能返回一个字段 ,比如 select Replaceletter('jk') from dual,
如果要返回两个数字,只能把这两个数字拼成一个字符串,比如 '10_11'。
你的字符映射规则确定就是A-Z映射到1-26么,而且确定有且只有两个字母?
如果是,可以用下面这种方式,分别截取第一位和第二位,计算ascii码减去96,最后再拼接起来

select to_char(ascii(substr(str, 1, 1)) - 96) || '_' ||
       to_char(ascii(substr(str, 2, 1)) - 96)
  from (select 'ab' str from dual)

建议你还是把原始需求描述一下,可能有其他解决方式,你要求的这种转换目前看上去很不合常理。