为了清洗包含脏数据的身份证号码,并据此判断用户的性别,我们需要处理三种情况:身份证号码中包含空格、身份证号码为 NULL、以及身份证号码为空字符串。以下是优化后的 SQL 查询语句,它将清晰地处理这些情况,并根据身份证号码的倒数第二位数字来判断性别(奇数为男性,偶数为女性)
-- [表名]: person
-- [字段]: party_id- 主键, card_id- 身份证,sex- 性别
SELECT
party_id,
-- 使用 regexp_replace 函数去除 card_id 中的所有空格
regexp_replace(card_id, '[[:space:]]', '', 'g') as card_id,
CASE
-- 如果身份证号码为null 或空字符 则性别为 ''
WHEN regexp_replace(card_id, '[[:space:]]', '', 'g') IS NULL OR regexp_replace(card_id, '[[:space:]]', '', 'g') = '' THEN NULL
ELSE CASE
WHEN substring(regexp_replace(card_id, '[[:space:]]', '', 'g') from char_length(regexp_replace(card_id, '[[:space:]]', '', 'g')) - 1 for 1) = '' THEN NULL
ELSE CASE
-- 如果倒数第二位数字是偶数,则性别为 0(女性)
WHEN substring(regexp_replace(card_id, '[[:space:]]', '', 'g') from char_length(regexp_replace(card_id, '[[:space:]]', '', 'g')) - 1 for 1)::int % 2 = 0 THEN 0
-- 否则,性别为 1(男性)
ELSE 1
END
END
END AS sex
FROM person
WHERE length(card_id) > 1;
标签:号码,space,中是,replace,身份证,regexp,id,card
From: https://www.cnblogs.com/zhangjin0094/p/18649866