SQL sever根据身份证判断性别函数

1. 基本查询示例

sql

复制代码
-- 假设表名为 users,身份证字段名为 id_card
SELECT 
    id_card,
    SUBSTRING(id_card, 17, 1) AS 第17位, -- 截取第17位
    CASE 
        WHEN CAST(SUBSTRING(id_card, 17, 1) AS INT) % 2 = 1 
        THEN '男' 
        ELSE '女' 
    END AS 性别
FROM users
WHERE LEN(id_card) = 18; -- 确保是18位身份证

2. 完整函数封装

sql

复制代码
-- 创建判断性别的函数
CREATE FUNCTION dbo.GetGenderByIdCard(@id_card VARCHAR(18))
RETURNS VARCHAR(2)
AS
BEGIN
    DECLARE @gender VARCHAR(2)
    
    IF LEN(@id_card) <> 18 OR ISNUMERIC(SUBSTRING(@id_card, 1, 17)) = 0
        RETURN '无效' -- 身份证格式不正确
        
    IF CAST(SUBSTRING(@id_card, 17, 1) AS INT) % 2 = 1
        SET @gender = '男'
    ELSE
        SET @gender = '女'
        
    RETURN @gender
END

使用函数:

sql

复制代码
SELECT id_card, dbo.GetGenderByIdCard(id_card) AS 性别
FROM users

3. 包含15位和18位身份证的判断

sql

复制代码
SELECT 
    id_card,
    CASE 
        WHEN LEN(id_card) = 15 THEN -- 15位旧身份证
            CASE 
                WHEN CAST(SUBSTRING(id_card, 15, 1) AS INT) % 2 = 1 
                THEN '男' 
                ELSE '女' 
            END
        WHEN LEN(id_card) = 18 THEN -- 18位新身份证
            CASE 
                WHEN CAST(SUBSTRING(id_card, 17, 1) AS INT) % 2 = 1 
                THEN '男' 
                ELSE '女' 
            END
        ELSE '格式错误'
    END AS 性别
FROM users

注意事项

  1. 异常处理:在实际使用时需要确保截取的字符是数字

  2. 性能优化:如果数据量较大,可以添加索引

  3. 数据验证:应先验证身份证格式是否正确

sql

复制代码
-- 更安全的查询(处理可能的非数字情况)
SELECT 
    id_card,
    CASE 
        WHEN ISNUMERIC(SUBSTRING(id_card, 17, 1)) = 1
        THEN CASE 
                WHEN CAST(SUBSTRING(id_card, 17, 1) AS INT) % 2 = 1 
                THEN '男' 
                ELSE '女' 
             END
        ELSE '未知'
    END AS 性别
FROM users
WHERE LEN(id_card) = 18;

提取年龄等其他信息(扩展)

sql

复制代码
-- 提取出生日期和计算年龄
SELECT 
    id_card,
    CASE 
        WHEN LEN(id_card) = 18 
        THEN CONVERT(DATE, SUBSTRING(id_card, 7, 8))
        WHEN LEN(id_card) = 15 
        THEN CONVERT(DATE, '19' + SUBSTRING(id_card, 7, 6))
    END AS 出生日期,
    DATEDIFF(YEAR, 
        CONVERT(DATE, 
            CASE 
                WHEN LEN(id_card) = 18 
                THEN SUBSTRING(id_card, 7, 8)
                WHEN LEN(id_card) = 15 
                THEN '19' + SUBSTRING(id_card, 7, 6)
            END
        ), 
        GETDATE()
    ) AS 年龄
FROM users
相关推荐
夏贰四13 分钟前
中小企业搭建业务中台如何控成本?业务中台轻量化落地分几步实施?
数据库·业务中台
林焱RPA41 分钟前
影刀RPA200篇纪念版:最实用的20个自动化场景大盘点
数据库
名字还没想好☜42 分钟前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
圆山猫1 小时前
[Virtualization](三):RISC-V H-extension 与 Guest 执行模式
android·java·risc-v
caishenzhibiao1 小时前
期货先行者主图 同花顺期货通指标
java·c语言·c#
史呆芬2 小时前
分布式事务实战:微服务跨服务数据一致性解决方案
java·后端·spring cloud
IT界的老黄牛2 小时前
限流命中后该怎么办:直接丢、阻塞等待、延迟重投三种姿势的取舍
java·rocketmq·redisson·令牌桶·削峰·分布式限流
daad7773 小时前
记录matlab状态机demo
java·网络·matlab
每天都要进步哦3 小时前
SQL单行函数详解:字符、数字、日期、转换与通用函数全解析
数据库·mysql
不剪发的Tony老师3 小时前
VeloxDB:一款免费开源的轻量级数据库管理工具
数据库·sql