程序由于容错处理,在数据库里有很多身份证的错误数据(还有些有字符,长度不正确).现在要批量查询这些数据出来.
条件是身份证长度为15位或是18位,不允许有字符以下是我写的,但是不能通过,因为原来的数据库里有字符的情况,请大侠指教
  select b.GRBM,b.GRBZDM,b.HKXZ,b.XM,b.XB,b.SFZHM,b.CSRQ,b.YHLB,b.mz,b.jg,b.whcd,b.shr,b.shsj
from jbxx_ryxx b
where (length(b.SFZHM)<>15 and length(b.SFZHM)<>18)
or (length(b.SFZHM)=15 and (
(Substr(b.SFZHM,9,2)>12)
or (Substr(b.SFZHM,11,2) > 31)
or (Substr(b.SFZHM,9,2) in (01,03,05,07,08,10,12) and Substr(b.SFZHM,11,2)>31)
or (Substr(b.SFZHM,9,2) in (04,06,09,11) and Substr(b.SFZHM,11,2)>30)
or (Substr(b.SFZHM,9,2)=02 and Substr(b.SFZHM,11,2)>29)))

解决方案 »

  1.   


    如果有字符,下面的式子返回真
    length(translate(b.SFZHM,
               '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
              '0123456789') < length(b.SFZHM)
      

  2.   

    少了右括号
    length(translate(b.SFZHM, 
                '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ', 
               '0123456789 '))  < length(b.SFZHM)
      

  3.   

    检索原来长度的同时(15或者18),用translate函数,把所有的数字还成空白,处理后的长度等于0,来判断。
      

  4.   

    这样是不能达到批量查询处理的要求吧
    要求:
    程序由于容错处理,在数据库里有很多身份证的错误数据(还有些有字符,长度不正确).现在要批量查询这些数据出来. 
    条件是身份证长度为15位或是18位,不允许有字符 
     大家不要限在我的SQL里,只要能满足我的要求就可以了
      

  5.   

    其实,大家给出的意见,都可以做到批量处理.只要你建立了相关的索引,速度一样很快.还有一个做法,就是使用正则表达式.
    REGEXP_LIKE函数.where REGEXP_LIKE(b.SFZHM,'^(¥d{15})|(¥d{18})$')顺便说一下:
    身份证号码里面有字母.不仅仅全是数字.
    我的18位的新身份证号码里面就有字母.
      

  6.   

    to:croatia,谢谢你,我用的是oracle 9版本,但我加上translate这个函数,
    在pl/sql里检索还是报"无效数字的错误"select b.GRBM,b.GRBZDM,b.HKXZ,b.XM,b.XB,b.SFZHM,b.CSRQ,b.YHLB,b.mz,b.jg,b.whcd,b.shr,b.shsj 
    from jbxx_ryxx b 
    where (length(b.SFZHM) < >15 and length(b.SFZHM) < >18) 
    or (length(b.SFZHM)=15 and ( 
    (Substr(translate(b.SFZHM,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '0123456789  '),9,2) >12) 
    or (Substr(translate(b.SFZHM,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '0123456789  '),11,2)  > 31) 
    or (Substr(translate(b.SFZHM,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '0123456789  '),9,2) in (01,03,05,07,08,10,12) and Substr(b.SFZHM,11,2) >31) 
    or (Substr(translate(b.SFZHM,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '0123456789  '),9,2) in (04,06,09,11) and Substr(b.SFZHM,11,2) >30) 
    or (Substr(translate(b.SFZHM,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '0123456789  '),9,2)=02 and Substr(b.SFZHM,11,2) >29)))
      

  7.   

    要写这么复杂的逻辑,还是写一个函数吧。赫赫。无效数字的错误,我想,应该和Substr有关系,因为,去掉了字母以后,可能长度都不够了。出了错误。你把检索出来的字符,还和数字12,31等等作比较。是这个地方有问题。逻辑上的顺序,应该是,
    1。长度为15或者18
    2。translate(字段,'0123456789','')以后,长度为0
    3。你想加的其他逻辑。
    最成一个函数吧。我想好很多。
      

  8.   

    to:croatia
    真是太感谢了,第一次在这版发贴子,得到你的帮助非常感谢我试图写一个存储过程,没有写出来,问题也是出在身份证长度为15位有字符的这个地方,所以再次请教你,是否可以尝到试写一下.贴出来学习一下.
      

  9.   

    嗬嗬,不用客气。类似这样子.没有环境测试,给你这个例子,你看看吧.CREATE OR REPLACE FUNCTION isIDNumber(IDNumber IN VARCHAR2)
    RETURN BOOLEAN IS
    BEGIN
      -- Check Length
      IF LENGTH(IDNumber) <> 15 OR LENGTH(IDNumber) <> 18 THEN
        RETURN FALSE;
      END IF;
      
      -- Check Digit
      IF LENGTH(TRANSLATE(IDNumber, '0123456789', '')) <> 0 THEN
        RETURN FALSE;
      END IF;
      
      -- Other Logic
      IF (SUBSTR(IDNumber, 1, 1) IN ('0','1','2','3','4','5','6','7','8','9')) THEN
        RETURN FALSE;
      END IF;  ......  RETURN TRUE;
      
    EXCEPTION  WHEN OTHERS THEN
        RETURN FALSE; END isIDNumber;
    /
      

  10.   

    成批处理EXCEL表中身份证信息程序,提取出生日期等,QQ:394921525