Oracle - 将所有字符替换为“X”,除了最后4个字符

时间:2018-04-20 10:37:56

标签: oracle

我试着在这里找到解决方案,但没有运气,所以我试着在这里提出一个问题,看看谁可以帮助我。

请参阅主题,我想将所有字符替换为“X”,但Oracle列的最后4个字符或更少字符除外。

例如:

  1. 123456789将成为XXXXX6789(前5个字符更改为X)
  2. 12345678将变为XXXX5678(前4个字符更改为X)
  3. 1234567将变为XXX4567(前三个字符更改为X)
  4. 123456将成为XX3456(前2个字符更改为X)
  5. 12345将成为X2345(第一个字符更改为X)
  6. 1234将成为1234(保持不变)
  7. 123将成为123(保持不变)
  8. 12将变为12(保持不变)
  9. 1将变为1(保持不变)
  10. 我尝试使用下面的语句,但似乎不适用于案例8和9。

    1)不返回任何内容而不是' 1'。

    Select RPAD('X',length('1')-4,'X') || substr('1',length('1')-4,length('1')) from dual
    

    2)返回' 2'而不是' 12'。

    Select RPAD('X',length('12')-4,'X') || substr('12',length('12')-4,length('12')) from dual
    

    我尝试使用下面的另一个声明,但它返回' XX67XX'而不是' XX6745'。

    我猜有重复的数字导致它返回无效值。

    select REPLACE('456745', substr('456745',1,length('456745')-4), RPAD('*',length('456745')-4,'X')) From dual
    

    也许有人可以帮忙吗?

    提前感谢。

1 个答案:

答案 0 :(得分:7)

这样的东西适用于更长的字符串:

LPAD(SUBSTR('123456789',-4),LENGTH('123456789'),'X')

我会将其包装在CASE声明中

CASE
  WHEN LENGTH(<your string>) > 4 
   THEN LPAD(SUBSTR(<your string>,-4),LENGTH(<your string>),'X')
  ELSE <your string>
END

其他一些人会发布美丽的正则表达式答案,这些答案让我着迷,因为我可以阅读它们但不能生成它们