pgSql验证18位身份证是否合格

 在表添加触发器,校验18位身份证号是否正确

CREATE OR REPLACE FUNCTION "public"."check_idcard"("a_sfz" varchar)
  RETURNS "pg_catalog"."varchar" AS $BODY$DECLARE
v_sfz  varchar;
v_i  integer;
v_sum  integer;
v_array1 integer[];
v_array2 varchar[];
v_s varchar;
v_county_code varchar[];
v_sf varchar;
v_day integer;
BEGIN
    v_sfz:=upper(trim(a_sfz));
    if length(v_sfz)=18 then
    --前2位省份是否正确
    v_county_code:=array['11','22','35','44','53','12','23','36','45','54','13','31','37','46','61','14','32','41','50','62','15','33','42','51','63','21','34','43','52','64','65','71','81','82'];
        v_sf:=left(v_sfz,2);
        v_i:=1;
        loop
          IF v_county_code[v_i]=v_sf THEN
                exit;
            END IF;
            v_i:=v_i + 1;
            if v_i>34 then
                return '身份证不正确,请检查';
            end if;
        end loop;
        ---年份是否正确
        if substr(v_sfz,7,4) not between '1900' and '2014' then 
            return'身份证年份错误';
        END IF;
        ---月份是否正确
        if substr(v_sfz,11,2) not between '01' and '12' then 
            return '身份证月份错误';
        END IF;
        --日期是否正确
        v_day=date_part('days',(to_date((substr(v_sfz,7,4)||'-'||substr(v_sfz,11,2)||'-01'),'yyyy-MM-dd')+ INTERVAL '1 month'-INTERVAL '1 day'));
        if cast(substr(v_sfz,13,2) as int) not between 1 and v_day then
            return '身份证日期错误';
        END IF;
        
        v_array1:=array[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
        v_array2:=array['1','0','X','9','8','7','6','5','4','3','2'];
        v_i:=1;
        v_sum:=0;
        loop
            v_s:=substr(v_sfz,v_i,1);
            v_sum:=v_sum + cast(v_s as integer)*v_array1[v_i];
            v_i:=v_i + 1;
            if v_i>17 then
                exit;
            end if;
        end loop;
        v_sum:=mod(v_sum,11) + 1;
        v_s:=v_array2[v_sum];
        if v_s=substr(v_sfz,18,1) then
            return 1;
        else
            return '身份证不正确';
        end if;
    else
            return -1;
    end if;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值