Oracle正则表达式将A替换为Z,B替换为Y,C替换为X,依此类推

时间:2013-06-13 14:12:00

标签: sql regex oracle

我想要一个正则表达式,用降序替换字符串及其各自的字符,包括数字: 即。

  • 使用降序字符串
  • 替换字母数字字符串
  • 如果在sting中找到特殊字符,请保持原样

我的意思是:                                             

A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   Z
Z   Y   X   W   V   U   T   S   R   Q   P   O   N   M   L   K   J   I   H   G   F   E   D   C   B   A

0   1   2   3   4   5   6   7   8   9
9   8   7   6   5   4   3   2   1   0

几个例子:

1)ABC * 1230 - > ZYX * 8739

2)Hello World! - > Svool Dliow!

3)好&不好 - > Tllw& Yzw

2 个答案:

答案 0 :(得分:13)

我使用Oracle TRANSLATE函数:

TRANSLATE(myValue,
  'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
  'ZYXWVUTSRQPONMLKJIHGFEDCBA9876543210')

答案 1 :(得分:3)

这里用REGEXP完成:

SELECT  LISTAGG(DECODE(o_str_level,NULL,srch_l.rs,o_str_level)) WITHIN GROUP (ORDER BY srch_l.ri) AS the_result
FROM
(
        SELECT  REGEXP_SUBSTR(t_str, '.', 1, LEVEL) rs
        ,       REGEXP_INSTR (t_str, '.', 1, LEVEL) ri
        FROM    
        (
                SELECT  'ABCDEF TUVWXYZ' AS t_str FROM DUAL
        ) test_str
        CONNECT BY LEVEL <= LENGTH(t_str)
) srch_l
LEFT JOIN
(
        SELECT  REGEXP_SUBSTR(r_str, '\w', 1, LEVEL) AS r_str_level
        ,       REGEXP_SUBSTR(o_str, '\w', 1, LEVEL) AS o_str_level
        FROM
        (
                SELECT  'ABCDEFGHIJKLMNOPQRSTUVWXYZ' r_str, 'ZYXWVUTSRQPONMLKJIHGFEDCBA' o_str FROM DUAL
        )
        CONNECT BY LEVEL <= 26
) apt
ON      srch_l.rs = apt.r_str_level;

-- Result:
-- ZYXWVU GFEDCBA

比TRANSLATE简单吗?几乎...

相关问题