请教下在mysql中判断身份证号是否符合规范,并输出不符合规范的行,应该怎么写?如同在EXCEL中的判断公式:
类似这个效果,请指导
-- 建表
CREATE TABLE `test_id` ( `id` VARCHAR ( 18 ) NOT NULL, PRIMARY KEY ( `id` ) );
-- 初始化数据
INSERT INTO `test_id` VALUES ( '123456789123456789' ),( '432831196411150810' );
-- 检查是否通过
SELECT
id,
check_sum,
IF
( MID( id, 18, 1 )= check_sum, '通过', '不通过' ) result
FROM
(
SELECT
id,
CASE
mod_sum
WHEN 0 THEN
'1'
WHEN 1 THEN
'0'
WHEN 2 THEN
'X' ELSE 12-mod_sum
END check_sum
FROM
(
SELECT
id,
MOD (
MID( id, 1, 1 )* 7 + MID( id, 2, 1 )* 9 + MID( id, 3, 1 )* 10 + MID( id, 4, 1 )* 5 + MID( id, 5, 1 )* 8 + MID( id, 6, 1 )* 4 + MID( id, 7, 1 )* 2 + MID( id, 8, 1 )* 1 + MID( id, 9, 1 )* 6 + MID( id, 10, 1 )* 3 + MID( id, 11, 1 )* 7 + MID( id, 12, 1 )* 9 + MID( id, 13, 1 )* 10 + MID( id, 14, 1 )* 5 + MID( id, 15, 1 )* 8 + MID( id, 16, 1 )* 4 + MID( id, 17, 1 )* 2,
11
) AS mod_sum
FROM
test_id
) temp
) t;
你可以把公式先贴出来,然后帮你翻译
该回答引用GPTᴼᴾᴱᴺᴬᴵ
在MySQL中判断身份证号是否符合规范,可以使用正则表达式来匹配身份证号码的格式。一般来说,中国大陆的身份证号码有18位,其中前17位是数字,最后一位可能是数字或字母(X或x)。
以下是一个示例查询,可以查找不符合规范的身份证号码所在的行:
SELECT *
FROM 表名
WHERE 身份证号码 NOT REGEXP '^[1-9]\\d{16}[0-9Xx]$';
这个查询语句使用了正则表达式 ^[1-9]\d{16}[0-9Xx]$ 来匹配符合规范的身份证号码。其中:
因此,这个正则表达式可以匹配符合规范的身份证号码。使用 NOT REGEXP 则表示不匹配该正则表达式,即查询出不符合规范的身份证号码所在的行。
如果需要指定某个表中的身份证号码字段进行查询,可以将 表名 替换为实际的表名,将 身份证号码 替换为实际的字段名即可。
需要注意的是,这个查询语句只能够筛选出身份证号码格式不符合规范的数据,并不能够验证身份证号码的真实性,因此在实际使用时需要慎重考虑。