我试图在我的oracle查询中隐藏SSN细节。
使用下面的查询标识SSN格式并将其替换为给定的格式。
从dual选择regexp_replace('123-45-6789',regexp_replace‘\1*\3\4’)
如果我运行这个查询,我将得到以下输出。
*6789
同样,我也想解析下面的格式。
ddddddd
或者如果连字符在任何地方都可以更好,但它应该只读9位数字。
由于我对RegEx不太熟悉,有人能帮我为这个需求构建正则表达式吗?
发布于 2018-04-24 10:58:55
这将捕获组中的前5个数字,并且完全忽略任何破折号。
-*(\d-*){5}((\d-*){4})示例
select regexp_replace('123-45-6789', '-*(\d-*){5}((\d-*){4})', '*****\2')- Out: `*****6789`
select regexp_replace('12-3456789', '-*(\d-*){5}((\d-*){4})', '*****\2')- Out: `*****6789`
select regexp_replace('---12-3--4567-89', '-*(\d-*){5}((\d-*){4})', '*****\2')- Out: `*****67-89`
发布于 2018-04-24 11:06:43
如果您想在忽略破折号的同时解析SSN,最好的方法可能是在尝试应用正则表达式之前替换任何破折号(假设这些是您需要担心的唯一非数字符号):
REPLACE(myssn, '-', '')然后您可以应用regex (尽管可能有一种更有效的方法;Oracle中的正则表达式非常昂贵):
SELECT REGEXP_REPLACE( REPLACE(myssn, '-', ''), '^.*\(d{4})$', '*****\1' )
FROM mytable;就我个人而言,我可能尝试以下几种方法,并完全避免正则表达式:
SELECT '*****' || SUBSTR( REPLACE(myssn, '-', ''), -4, 4 )
FROM mytable;希望这能有所帮助。
发布于 2018-04-24 11:48:51
如果您想利用Oracle数据库提供的现有功能,这里有一个机会。
Oracle编校功能允许在数据库中设置编辑策略,这样,当无特权的用户查询数据时,他们只会看到他们应该能够做到的事情,这可能不是随机数据,也可能是部分编辑的数据。
其中的一个特点是一些内置的社会保障政策号码。
如果您的当前安装可以使用此功能,请检查它,因为它可以为您的应用程序和报告层节省大量工作。
以下是党卫军的内置政策:
Example 5-7 Partially Redacted Character Values
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => 'mavis',
object_name => 'cust_info',
column_name => 'ssn',
policy_name => 'redact_cust_ssns3',
function_type => DBMS_REDACT.PARTIAL,
function_parameters => DBMS_REDACT.REDACT_US_SSN_F5,
expression => '1=1',
policy_description => 'Partially redacts 1st 5 digits in SS numbers',
column_description => 'ssn contains Social Security numbers');
END;
/
Query and redacted result:
SELECT ssn FROM mavis.cust_info;
SSN
-------
XXX-XX-4320
XXX-XX-4323
XXX-XX-4325
XXX-XX-4329https://stackoverflow.com/questions/49999588
复制相似问题