程序由于容错处理,在数据库里有很多身份证的错误数据(还有些有字符,长度不正确).现在要批量查询这些数据出来.
条件是身份证长度为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)))
解决方案 »
- 关于Oracle软件的购买方面的问题
- sequence在insert into时抱错。
- 一个简单的问题
- sql 子查询 用oracle函数实现,怎么做?
- 求大神指导
- 关于大项目历史数据的问题。。
- 关于Oracle7中存储过程的问题(100分,不够再加)在线等待
- 用plsql developer单步调试,为什么不能显示变量的值???
- 在单机上建立oracle数据库的问题
- 关于Oracle的安装问题
- SQL*Loader-522:数据倒入时报错:SQL*Loader-522: lfiopn failed for file (demo.log)
- 求助:碰到执行truncate table 速度超慢的难题
如果有字符,下面的式子返回真
length(translate(b.SFZHM,
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
'0123456789') < length(b.SFZHM)
length(translate(b.SFZHM,
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ',
'0123456789 ')) < length(b.SFZHM)
要求:
程序由于容错处理,在数据库里有很多身份证的错误数据(还有些有字符,长度不正确).现在要批量查询这些数据出来.
条件是身份证长度为15位或是18位,不允许有字符
大家不要限在我的SQL里,只要能满足我的要求就可以了
REGEXP_LIKE函数.where REGEXP_LIKE(b.SFZHM,'^(¥d{15})|(¥d{18})$')顺便说一下:
身份证号码里面有字母.不仅仅全是数字.
我的18位的新身份证号码里面就有字母.
在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)))
1。长度为15或者18
2。translate(字段,'0123456789','')以后,长度为0
3。你想加的其他逻辑。
最成一个函数吧。我想好很多。
真是太感谢了,第一次在这版发贴子,得到你的帮助非常感谢我试图写一个存储过程,没有写出来,问题也是出在身份证长度为15位有字符的这个地方,所以再次请教你,是否可以尝到试写一下.贴出来学习一下.
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;
/