使用Oracle -sqldeveloper查找SSN

时间:2015-12-09 14:30:46

标签: oracle oracle-sqldeveloper

我试图在Oracle -sqldeveloper中编写此查询,并且我收到错误消息。这是我第一次在甲骨文工作,所以如果我犯了新手的错误,请原谅。

我被要求查看我们的数据库,看看最终用户是否有机会在此表中输入他们的SSN号码。有些用户可能输入XXX-XX-1234,有些可能输入123-34-567,有些可能输入XXXXXXXXX,有些可能输入123456789 - 我需要找到所有这些,我在SQL中尝试这个并且它工作但是当我复制时代码进入oracle-sqldev它带回了错误信息,我现在尝试了几天来弄清楚到底发生了什么,但我无法弄明白。

这里有我在sql中的代码

select*
from ARTICLES 
where ARTICLE_BODY NOT LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'

2 个答案:

答案 0 :(得分:0)

您应该阅读有关Like here的文档。您可以使用REGEXP_LIKE,但这也可以使用其他Oracle内置函数

SELECT *
FROM ARTICLES
WHERE LENGTH(TRANSLATE(ARTICLE_BODY,
'1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-','1234567890')) > 8

这将为您提供文本中包含8个以上数字的所有文章正文。您还没有提供有关可输入内容的大量信息,并且验证自由文本很难,但这应该可以帮助您入门。

然而,这不适用于CLOBS。

  

涉及模式作为参数的操作,例如COMPARE,INSTR,   和SUBSTR不支持正则表达式或特殊匹配   模式中的字符(例如SQL中LIKE运算符中的%)   参数或子串。   来自文档here

为了做到这一点,必须创建一个PL / SQL过程来读取4000个字符块,将其放入VARCHAR2变量然后搜索。

答案 1 :(得分:0)

这是一个尝试使用许多不同的测试字符串。绝对可以根据需要添加更多。尝试从用户可以输入任何内容的文本块中选择将永远不会是100%。这会尝试选择ARTICLE_BODY,其中包含至少9个但不超过11​​个字符的字符串,其中包含一个或多个X或一个或多个数字或一个或一个或两个可选短划线,同时处理字符串多行和不区分大小写( where子句使用REGEXP_LIKE)。然后它用三方括号围绕匹配,使匹配在输出中突出,供您验证。请注意,即使它不是SSN,也会选择第9行,因为它符合条件。根据用户输入的内容,我会害怕这种情况。确保此数据的使用者知道这些结果无法验证为100%准确。谁知道可以输入什么。只需确保正则表达式处理可以识别的条件。祝你好运!

SQL> with articles(line, article_body) as (
   select 1, 'aaXXX-XX-1234aa' from dual union
   select 2, '123-45-6789'     from dual union
   select 3, '123456789'       from dual union
   select 4, 'XXXXXXXXX'       from dual union
   select 5, 'XXXXX.XXXX'      from dual union
   select 6, 'efs'             from dual union
   select 7, 'Some user might enter XXX-XX-1234, some might enter 123-34-567, some might enter XXXXXXXXX,
hem, I try this in SQL and it work but when i copy the code into oracle-sqldev it came back with error messa
he heck is going on but I cant seem to figure it out.' from dual union
   select 8, '123'             from dual union
   select 9, 'X12345678X'      from dual
   )
   select line, regexp_replace(article_body, '((X+|\d+|-{1,2}?){9,11})', '[[[\1]]]', 1, 0, 'im') Possible_ssns
   from articles
   where regexp_like(article_body, '(X+|\d+|-{1,2}?){9,11}', 'im')
   order by line;

      LINE POSSIBLE_SSNS
---------- --------------------------------------------------
         1 aa[[[XXX-XX-1234]]]aa
         2 [[[123-45-6789]]]
         3 [[[123456789]]]
         4 [[[XXXXXXXXX]]]
         7 Some user might enter [[[XXX-XX-1234]]], some migh
           t enter [[[123-34-567]]], some might enter [[[XXXX
           XXXXX]]], some might enter [[[123456789]]] - I nee
           d to find ALL of them, I try this in SQL and it wo
           rk but when i copy the code into oracle-sqldev it
           came back with error message and I try for a few d
           ays now to figure out what the heck is going on bu
           t I cant seem to figure it out.
         9 [[[X12345678X]]]

6 rows selected.

SQL>