PosgreSQL函数验证身份证
-- 创建一个函数,用于验证用户提供的身份证号是否有效
CREATE OR REPLACE FUNCTION validate_id_card(id_card text) RETURNS boolean AS $$
BEGIN
-- 身份证号码正则表达式
-- 18位,前17位为数字,最后一位为数字或字母X/x
-- 例如: 12345678901234567X
-- 正则表达式解析:
-- ^ 开始
-- \d{17} 前17位为0-9的数字
-- [0-9Xx] 最后一位为0-9或X/x
-- $ 结束
IF id_card ~ '^(\d{17}[0-9Xx])$' THEN
-- 检查校验码的有效性
-- 加权因子
int[] weights = array[7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
-- 校验码对应的数字
text[] check_digits = array['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
-- 计算校验码
int sum = 0;
FOR i IN 1..17 LOOP
sum = sum + (substring(id_card, i, 1)::int * weights[i]);
END LOOP;
-- 计算模
int mod_result = sum % 11;
-- 比较校验码
IF check_digits[mod_result + 1] = upper(substring(id_card, 18, 1)) THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
ELSE
RETURN FALSE;
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE;
-- 使用示例
SELECT validate_id_card('12345678901234567X'); -- 应返回TRUE
SELECT validate_id_card('123456789012345678'); -- 应返回FALSE,因为校验码不正确
这段代码首先定义了一个正则表达式来验证身份证号码的格式,然后通过计算得出的加权因子来验证最后一个校验码的正确性。这个函数是不可变的(IMMUTABLE),意味着在相同的输入下它总是返回相同的结果,并且在数据库会话之间保持一致。
评论已关闭