求解答:
       数据库当中存在15位同时存在18位的身份证号
在前台登记的时候,想根据输入的身份证号来判断
    我的问题是当输入15或18都可以确定到唯一的那个人 ,怎么实现?

解决方案 »

  1.   

    这个比一定要在Oracel的SQL或存储过程里面判断处理吧.
    你取出数据后在前台判断下好了;根据算法;写个函数不就完了么
      

  2.   

    某男性公民身份号码本体码为34052419800101001,首先按照公式⑴计算: ∑(ai×Wi)(mod 11)……………………………………(1) 公式(1)中:
    i----表示号码字符从由至左包括校验码在内的位置序号;
    ai----表示第i位置上的号码字符值;
    Wi----示第i位置上的加权因子,其数值依据公式Wi=2(n-1)(mod 11)计算得出。 i       18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1 ai       3  4  0  5  2  4  1  9  8  0  0  1  0  1  0  0  1 a1 Wi       7  9 10  5  8  4  2  1  6  3  7  9 10  5  8  4  2  1 ai×Wi  21 36  0 25 16 16  2  9 48  0  0  9  0  5  0  0  2 a1 根据公式(1)进行计算: ∑(ai×Wi) =(21+36+0+25+16+16+2+9+48++0+0+9+0+5+0+0+2) = 189 189 ÷ 11 = 17 + 2/11 ∑(ai×Wi)(mod 11) = 2     然后根据计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10: ∑(ai×WI)(mod 11)   0 1 2 3 4 5 6 7 8 9 10 
    校验码字符值ai       1 0 X 9 8 7 6 5 4 3  2
        根据上表,查出计算结果为2的校验码为所以该人员的公民身份号码应该为 34052419800101001X。
      

  3.   

    这里是我一直在用的算法!
    你可以用function GetSFZJYM(SFZHM varchar2),函数返回值为18位身份证号码的最后1位,然后将18位身份证号码进行比较即可!
    --For Oracle 版
      
      create or replace function GetSFZJYM(SFZHM varchar2) return  varchar2 is
      Result varchar2(1);
      --type Tjqyz is array(18) of integer;
      Type Tjqyz is Table Of Number Index by Binary_Integer;
      vjqyz Tjqyz;
      jymzf varchar2(11);
      wadd   integer;
      i      integer;
      j      integer;
      vsfzhm varchar2(18);
    begin
      vsfzhm := sfzhm;
      if length(vsfzhm)=15 then
        vsfzhm :=substr(vsfzhm,1,6)||'19'||substr(vsfzhm,7,9);
      end if;
      vjqyz(1):=7;
      vjqyz(2):=9;
      vjqyz(3):=10;
      vjqyz(4):=5;
      vjqyz(5):=8;
      vjqyz(6):=4;
      vjqyz(7):=2;
      vjqyz(8):=1;
      vjqyz(9):=6;
      vjqyz(10):=3;
      vjqyz(11):=7;
      vjqyz(12):=9;
      vjqyz(13):=10;
      vjqyz(14):=5;
      vjqyz(15):=8;
      vjqyz(16):=4;
      vjqyz(17):=2;
      vjqyz(18):=1;
     
      jymzf := '10X98765432';
      wadd := 0;
      for i in 1..17 loop
        wadd := wadd + vjqyz(i)*to_number(substr(vsfzhm,i,1));
      end loop;
      j := (wadd mod 11) + 1;
      if wadd<>0 then
        if j=3 then
          result := 'X';
        else
          result := substr(jymzf,j,1);
        end if;    
      end if;
      
      return(Result);
    end GetSFZJYM;