前面有一篇文章,利用SQL進行身份證號碼校驗,今天也是談身份證的一些事情。就是從給出的身份證號碼中提取地域、性別、年齡和校驗值。
身份證校驗是個老生常談的問題,這里就不再贅述了,感興趣的可以點擊上面的鏈接看以前那篇文章。
在電商和互聯(lián)網(wǎng)項目中,欺詐行為是一個常見的風險。通過分析下單用戶的地域分布,會計師可以識別出一些異常的訂單模式,如來自高風險地區(qū)的大量異常訂單、同一地區(qū)多個用戶使用相似的支付方式或收貨地址等。這些異常情況可能提示存在欺詐風險,會計師可以及時采取措施,如加大訂單審計、驗證用戶身份等。
為了測試的準確性,這里以公安部發(fā)布的A級通緝令的兩個犯人的身份證號為例來說明。
假設我們的測試表就是以上兩位通緝犯人的信息。
測試代碼:
SELECT
`name`,
idcard,
CASE
LEFT ( idcard, 2 )
WHEN '11' THEN '北京市'
WHEN '12' THEN '天津市'
WHEN '13' THEN '河北省'
WHEN '14' THEN '山西省'
WHEN '15' THEN '內(nèi)蒙古自治區(qū)'
WHEN '21' THEN '遼寧省'
WHEN '22' THEN '吉林省'
WHEN '23' THEN '黑龍江省'
WHEN '31' THEN '上海市'
WHEN '32' THEN '江蘇省'
WHEN '33' THEN '浙江省'
WHEN '34' THEN '安徽省'
WHEN '35' THEN '福建省'
WHEN '36' THEN '江西省'
WHEN '37' THEN '山東省'
WHEN '41' THEN '河南省'
WHEN '42' THEN '湖北省'
WHEN '43' THEN '湖南省'
WHEN '44' THEN '廣東省'
WHEN '45' THEN '廣西壯族自治區(qū)'
WHEN '46' THEN '海南省'
WHEN '50' THEN '重慶市'
WHEN '51' THEN '四川省'
WHEN '52' THEN '貴州省'
WHEN '53' THEN '云南省'
WHEN '54' THEN '西藏自治區(qū)'
WHEN '61' THEN '陜西省'
WHEN '62' THEN '甘肅省'
WHEN '63' THEN '青海省'
WHEN '64' THEN '寧夏回族自治區(qū)'
WHEN '65' THEN '新疆維吾爾族自治區(qū)'
WHEN '71' THEN '臺灣省'
WHEN '81' THEN '香港特別行政區(qū)'
WHEN '82' THEN '澳門特別行政區(qū)' ELSE '未知'
END AS 地域,
YEAR (
curdate()) -
IF
(
length( idcard ) = 18,
substring( idcard, 7, 4 ),
IF
( length( idcard ) = 15, concat( '19', substring( idcard, 7, 2 )), NULL )) AS 年齡,
CASE
IF
(
length( idcard ) = 18,
cast( substring( idcard, 17, 1 ) AS UNSIGNED )% 2,
IF
( length( idcard )= 15, cast( substring( idcard, 15, 1 ) AS UNSIGNED )% 2, 3 ))
WHEN 1 THEN '男'
WHEN 0 THEN '女' ELSE '未知'
END AS 性別,
CASE
((
SUBSTRING( idcard, 1, 1 )* 7
)+(
SUBSTRING( idcard, 2, 1 )* 9
)+(
SUBSTRING( idcard, 3, 1 )* 10
)+ ( SUBSTRING( idcard, 4, 1 )* 5 )+(
SUBSTRING( idcard, 5, 1 )* 8
)+(
SUBSTRING( idcard, 6, 1 )* 4
)+ ( SUBSTRING( idcard, 7, 1 )* 2 )+(
SUBSTRING( idcard, 8, 1 )* 1
)+(
SUBSTRING( idcard, 9, 1 )* 6
)+ ( SUBSTRING( idcard, 10, 1 )* 3 )+(
SUBSTRING( idcard, 11, 1 )* 7
)+(
SUBSTRING( idcard, 12, 1 )* 9
)+ ( SUBSTRING( idcard, 13, 1 )* 10 )+(
SUBSTRING( idcard, 14, 1 )* 5
)+(
SUBSTRING( idcard, 15, 1 )* 8
)+ ( SUBSTRING( idcard, 16, 1 )* 4 )+(
SUBSTRING( idcard, 17, 1 )* 2
)) % 11
WHEN 0 THEN '1'
WHEN 1 THEN '0'
WHEN 2 THEN 'X'
WHEN 3 THEN '9'
WHEN 4 THEN '8'
WHEN 5 THEN '7'
WHEN 6 THEN '6'
WHEN 7 THEN '5'
WHEN 8 THEN '4'
WHEN 9 THEN '3'
WHEN 10 THEN '2' ELSE '未知'
END AS 校驗值
FROM
t_id;
測試結果:
該文章在 2024/9/18 12:11:26 編輯過