前面有一篇文章,利用SQL進(jìn)行身份證號(hào)碼校驗(yàn),今天也是談身份證的一些事情。就是從給出的身份證號(hào)碼中提取地域、性別、年齡和校驗(yàn)值。
身份證校驗(yàn)是個(gè)老生常談的問(wèn)題,這里就不再贅述了,感興趣的可以點(diǎn)擊上面的鏈接看以前那篇文章。
在電商和互聯(lián)網(wǎng)項(xiàng)目中,欺詐行為是一個(gè)常見(jiàn)的風(fēng)險(xiǎn)。通過(guò)分析下單用戶的地域分布,會(huì)計(jì)師可以識(shí)別出一些異常的訂單模式,如來(lái)自高風(fēng)險(xiǎn)地區(qū)的大量異常訂單、同一地區(qū)多個(gè)用戶使用相似的支付方式或收貨地址等。這些異常情況可能提示存在欺詐風(fēng)險(xiǎn),會(huì)計(jì)師可以及時(shí)采取措施,如加大訂單審計(jì)、驗(yàn)證用戶身份等。
為了測(cè)試的準(zhǔn)確性,這里以公安部發(fā)布的A級(jí)通緝令的兩個(gè)犯人的身份證號(hào)為例來(lái)說(shuō)明。

假設(shè)我們的測(cè)試表就是以上兩位通緝犯人的信息。

測(cè)試代碼:
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 '臺(tái)灣省'
WHEN '81' THEN '香港特別行政區(qū)'
WHEN '82' THEN '澳門(mén)特別行政區(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 校驗(yàn)值
FROM
t_id;
測(cè)試結(jié)果:

該文章在 2024/9/18 12:11:26 編輯過(guò)