2015-12-09 42 views
0

我试图在Oracle -sqldeveloper中编写此查询,并且收到错误消息。这是我第一次在Oracle工作,所以请原谅我是否犯了新手错误。使用Oracle查找SSN -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]' 
+1

什么是错误消息,你确定你正在运行相同的查询吗?帮助我们帮助你! – kevinsky

+0

嗨,我只是复制和过去的错误代码,我意识到我错过了'在后面,所以没有错误,但它给我的一切在“ARTICLE_BODY”,即使是那些只有简单的文本。对不起,我没有澄清“ARTICLE_BODY”只是一个文本框..用户可以输入随机的东西 – thaibythai

+0

在最后的评论后,不清楚你是否仍然有错误或你想解决什么问题。请相应地编辑您的问题。 – Alfabravo

回答

0

你应该了解像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变量,然后在该搜索。

+0

感谢您的链接 - 我现在要检查它并希望更好地理解关系。我会尝试一下代码。 – thaibythai

+0

我收到一个错误“ORA-22835:CLOB到CHAR或BLOB到RAW转换的缓冲区太小(实际:4343,最大:4000)”我也尝试做<9来查看它是否返回较少,但是相同错误信息。 – thaibythai

+0

我刚刚添加了select cast(substr(ARTICLE_BODY,1,2000)as varchar(4000 byte))将会看到这个是否会起作用 – thaibythai

0

下面是一些尝试与一些不同的测试字符串。当你认为合适时,肯定会增加更多。试图从用户可以输入任何内容的文本块中选择将永远不会100%。这将尝试选择ARTICLE_BODY,其中它包含至少9但不超过11​​个字符的字符串,其中包含一个或多个X或一个或多个数字或一个或一个或两个可选的破折号,同时处理字符串多行和不区分大小写( where子句使用REGEXP_LIKE)。然后用三个方括号将比赛包围起来,以使比赛在输出中突出显示,供您验证。请注意,第9行被选中,因为它符合条件,即使它不是SSN。这会发生,恐怕取决于用户输入的内容。确保这些数据的使用者知道这些结果不能被验证为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> 
+0

谢谢,请给我一个尝试以及... I已经提到,在一个开放的文本框中找到SSN几乎是不可能的,无论我能找到什么,甚至可能不是SSN,或者它可能不包括100%,但我被告知要找到任何东西或像我一样可以...但有超过7K的记录。 – thaibythai

相关问题