程序由于容错处理,在数据库里有很多身份证的错误数据(还有些有字符,长度不正确).现在要批量查询这些数据出来.
条件是身份证长度为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中sum函数得出的结果与jsp中显示的不同
- 一个关于oracle 数据链路的问题!急急!!!!!!!!!!
- oracle job相关问题
- 数据迁移问题
- 请教oracle中一个配置用户的问题
- 导数问题
- 导入dmp文件的时候,log文件显示IMP-00010: 不是有效的导出文件..
- 新手变量定义的问题(急)
- SQL语句技巧,怎样查询才高效?
- Oracle 8.17优化及字符集问题! 谢谢
- 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;
/