【问题标题】:Oracle - Replacing all characters to “X”, except last 4 characterOracle - 将所有字符替换为“X”,最后 4 个字符除外
【发布时间】:2018-10-01 01:25:28
【问题描述】:

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

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

例如:

  1. 123456789 将变为 XXXXX6789(前 5 个字符更改为 X)
  2. 12345678 将变为 XXXX5678(前 4 个字符更改为 X)
  3. 1234567 将变为 XXX4567(前 3 个字符更改为 X)
  4. 123456 将变为 XX3456(前 2 个字符更改为 X)
  5. 12345 将变为 X2345(第一个字符变为 X)
  6. 1234 将变为 1234(保持不变)
  7. 123 将变为 123(保持不变)
  8. 12 将变为 12(保持不变)
  9. 1 将变为 1(保持不变)

我尝试使用下面的语句,但似乎不适用于案例 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

也许有人可以帮忙?

提前致谢。

【问题讨论】:

  • 如果这是应用程序安全要求,我们的编辑策略功能允许将此正则表达式应用于列,因此应用程序层中的代码不需要更改 - 只需查询您的号码,它就会被编辑出来数据库

标签: oracle


【解决方案1】:

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

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

其他人会发布漂亮的正则表达式答案,这让我着迷,因为我可以阅读它们但无法生成它们

【讨论】:

  • 哈哈,我期待一个正则表达式的答案,但这种情况下的语句更容易理解,最终效率更高
  • 感谢您的帮助。我管理将您的示例应用于我的项目。非常感谢您的帮助。
猜你喜欢
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 2019-09-01
相关资源
最近更新 更多