求助大家一个批量查询身份证和出生日期SQL

xin_Zhang 2007-10-17 03:40:43

程序由于容错处理,在数据库里有很多身份证的错误数据(还有些有字符,长度不正确).现在要批量查询这些数据出来.
条件是身份证长度为15位或是18位,不允许有字符

以下是我写的,但是不能通过,因为原来的数据库里有字符的情况,请大侠指教
select b.GRBM,b.GRBZDM,b.HKXZ,b.XM,b.XB,b.SFZHM,b.CSRQ,b.YHLB,b.mz,b.jg,b.whcd,b.shr,b.shsj
from jbxx_ryxx b
where (length(b.SFZHM)<>15 and length(b.SFZHM)<>18)
or (length(b.SFZHM)=15 and (
(Substr(b.SFZHM,9,2)>12)
or (Substr(b.SFZHM,11,2) > 31)
or (Substr(b.SFZHM,9,2) in (01,03,05,07,08,10,12) and Substr(b.SFZHM,11,2)>31)
or (Substr(b.SFZHM,9,2) in (04,06,09,11) and Substr(b.SFZHM,11,2)>30)
or (Substr(b.SFZHM,9,2)=02 and Substr(b.SFZHM,11,2)>29)))
...全文
2121 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
shen1zhi2ping 2011-10-25
  • 打赏
  • 举报
回复
成批处理EXCEL表中身份证信息程序,提取出生日期等,QQ:394921525
QQ85743282 2011-05-14
  • 打赏
  • 举报
回复
我有一个身份证真假验证的接口数据来源是公安部,可以根据名字和证号得到头像,如果需要可找我QQ85743282
sunyujia 2007-10-19
  • 打赏
  • 举报
回复
学习
kinglht 2007-10-18
  • 打赏
  • 举报
回复
关注一下!
Croatia 2007-10-18
  • 打赏
  • 举报
回复
嗬嗬,不用客气。

类似这样子.没有环境测试,给你这个例子,你看看吧.

CREATE OR REPLACE FUNCTION isIDNumber(IDNumber IN VARCHAR2)
RETURN BOOLEAN IS
BEGIN
-- Check Length
IF LENGTH(IDNumber) <> 15 OR LENGTH(IDNumber) <> 18 THEN
RETURN FALSE;
END IF;

-- Check Digit
IF LENGTH(TRANSLATE(IDNumber, '0123456789', '')) <> 0 THEN
RETURN FALSE;
END IF;

-- Other Logic
IF (SUBSTR(IDNumber, 1, 1) IN ('0','1','2','3','4','5','6','7','8','9')) THEN
RETURN FALSE;
END IF;

......

RETURN TRUE;

EXCEPTION

WHEN OTHERS THEN
RETURN FALSE;

END isIDNumber;
/
xin_Zhang 2007-10-18
  • 打赏
  • 举报
回复
to:croatia
真是太感谢了,第一次在这版发贴子,得到你的帮助非常感谢

我试图写一个存储过程,没有写出来,问题也是出在身份证长度为15位有字符的这个地方,所以再次请教你,是否可以尝到试写一下.贴出来学习一下.
Croatia 2007-10-18
  • 打赏
  • 举报
回复
要写这么复杂的逻辑,还是写一个函数吧。赫赫。

无效数字的错误,我想,应该和Substr有关系,因为,去掉了字母以后,可能长度都不够了。出了错误。你把检索出来的字符,还和数字12,31等等作比较。是这个地方有问题。

逻辑上的顺序,应该是,
1。长度为15或者18
2。translate(字段,'0123456789','')以后,长度为0
3。你想加的其他逻辑。
最成一个函数吧。我想好很多。
xin_Zhang 2007-10-18
  • 打赏
  • 举报
回复
to:croatia,谢谢你,我用的是oracle 9版本,但我加上translate这个函数,
在pl/sql里检索还是报"无效数字的错误"

select b.GRBM,b.GRBZDM,b.HKXZ,b.XM,b.XB,b.SFZHM,b.CSRQ,b.YHLB,b.mz,b.jg,b.whcd,b.shr,b.shsj
from jbxx_ryxx b
where (length(b.SFZHM) < >15 and length(b.SFZHM) < >18)
or (length(b.SFZHM)=15 and (
(Substr(translate(b.SFZHM,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '0123456789 '),9,2) >12)
or (Substr(translate(b.SFZHM,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '0123456789 '),11,2) > 31)
or (Substr(translate(b.SFZHM,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '0123456789 '),9,2) in (01,03,05,07,08,10,12) and Substr(b.SFZHM,11,2) >31)
or (Substr(translate(b.SFZHM,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '0123456789 '),9,2) in (04,06,09,11) and Substr(b.SFZHM,11,2) >30)
or (Substr(translate(b.SFZHM,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', '0123456789 '),9,2)=02 and Substr(b.SFZHM,11,2) >29)))

Croatia 2007-10-17
  • 打赏
  • 举报
回复
REGEXP_LIKE需要10g的版本。
Croatia 2007-10-17
  • 打赏
  • 举报
回复
其实,大家给出的意见,都可以做到批量处理.只要你建立了相关的索引,速度一样很快.

还有一个做法,就是使用正则表达式.
REGEXP_LIKE函数.

where REGEXP_LIKE(b.SFZHM,'^(¥d{15})|(¥d{18})$')

顺便说一下:
身份证号码里面有字母.不仅仅全是数字.
我的18位的新身份证号码里面就有字母.
xin_Zhang 2007-10-17
  • 打赏
  • 举报
回复
这样是不能达到批量查询处理的要求吧
要求:
程序由于容错处理,在数据库里有很多身份证的错误数据(还有些有字符,长度不正确).现在要批量查询这些数据出来.
条件是身份证长度为15位或是18位,不允许有字符


大家不要限在我的SQL里,只要能满足我的要求就可以了
Croatia 2007-10-17
  • 打赏
  • 举报
回复
检索原来长度的同时(15或者18),用translate函数,把所有的数字还成空白,处理后的长度等于0,来判断。
ruihuahan 2007-10-17
  • 打赏
  • 举报
回复
少了右括号
length(translate(b.SFZHM,
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ',
'0123456789 ')) < length(b.SFZHM)
ruihuahan 2007-10-17
  • 打赏
  • 举报
回复

如果有字符,下面的式子返回真
length(translate(b.SFZHM,
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
'0123456789') < length(b.SFZHM)

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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