根据18位身份证和15位身份证输出省份性别和年龄

benpao002 2018-03-02 11:20:39
select case left(idcard,2)
when '11' then '北京市'
when '12' then '天津市'
when '13' then '河北省'
when '14' then '山西省'
when '15' then '内蒙古自治区'
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 '广西壮族自治区'
when '46' then '海南省'
when '50' then '重庆市'
when '51' then '四川省'
when '52' then '贵州省'
when '53' then '云南省'
when '54' then '西藏自治区'
when '61' then '陕西省'
when '62' then '甘肃省'
when '63' then '青海省'
when '64' then '宁夏回族自治区'
when '65' then '新疆维吾尔自治区'
when '71' then '台湾省'
when '81' then '香港特别行政区'
when '82' then '澳门特别行政区'
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 性别

FROM `user`


想根据18位身份证和15位身份证查询身份、年龄、性别,看网上写的这个,发现只能输出最后一行,其余的年龄输出为Null,性别输出为Null,省份能够完全输出,还有2002年出生的,年龄怎么输出。求解决办法。测试数据


421224198508136425
429006199207163644
429006199608123652
429006199808163664
429006199608163694
429006960816369
429006200208163695
429006020816369
...全文
1315 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hello World, 2018-03-02
  • 打赏
  • 举报
回复
可用trim来去除前后的空格,再判断就可以了。 另外身份证号码1999年10月以后就都是18位的了,2002年还有15位就是假证了
  • 打赏
  • 举报
回复
看看首尾是否有不可见符号。 截止前18位,后18位这种
benpao002 2018-03-02
  • 打赏
  • 举报
回复
发现问题出在length上,明明长度是18,mysql上却显示19,长度15的显示为16,最后一行的长度是正确的
benpao002 2018-03-02
  • 打赏
  • 举报
回复
引用 5 楼 benpao002 的回复:
[quote=引用 2 楼 baidu_36457652 的回复:] 看看首尾是否有不可见符号。 截止前18位,后18位这种
不会弄[/quote] 应该是不可见字符,怎么把不可见字符给去掉呢
Hello World, 2018-03-02
  • 打赏
  • 举报
回复
测试ascii(substr(sfz,19,1))好像有个换行符,用update test.user set sfz=replace(sfz,char(13),'')替换掉试下
benpao002 2018-03-02
  • 打赏
  • 举报
回复
引用 3 楼 apollokk 的回复:
可用trim来去除前后的空格,再判断就可以了。 另外身份证号码1999年10月以后就都是18位的了,2002年还有15位就是假证了
用了trim函数还是不行
benpao002 2018-03-02
  • 打赏
  • 举报
回复
引用 2 楼 baidu_36457652 的回复:
看看首尾是否有不可见符号。 截止前18位,后18位这种
不会弄
benpao002 2018-03-02
  • 打赏
  • 举报
回复
引用 3 楼 apollokk 的回复:
可用trim来去除前后的空格,再判断就可以了。 另外身份证号码1999年10月以后就都是18位的了,2002年还有15位就是假证了
能否帮忙具体写下,哈哈,只是测试数据 drop table if exists user; create table user ( sfz varchar(idcard) ); load data infile 'G:\\mysql\\data\\cards1.txt' into table user;

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧