如何使用PLSQL精准筛选并输出包含恰好10位数值的记录?
调整PLSQL正则查询以筛选仅含恰好10位数值的记录
原查询语句:
SELECT carddetails FROM cc_emp_card WHERE REGEXP_LIKE ( carddetails,'[[:digit:]]{10}?([^[:digit:]])');
当前输出包含带11位及以上连续数字的不符合预期记录,需要筛选出仅包含恰好10位数值的记录,当前输出和预期输出如下:
当前输出
FT 6820220419001794 xxx asdfwf 2 BIM 2022 FT 6820220419001796 xsdjcc jcw 2 BIM 2022 FT 6820220419001796 ajscbjk , c dk2 BIM 2022 000006650445/Business Meals (Staff with Externals) 5010083131,1234567890 1234567890 5010009921 dcbjwk ft 4959 29.04 5010018300 Dmdbchbk jdkjw 11 del 09.05 5000630739 dbcwbdj FT 9/001 DEL 13.05 5010015146 mnwd chjw FT 4 DEL 29.04.22
预期输出
5010083131,1234567890 1234567890 5010009921 dcbjwk ft 4959 29.04 5010018300 Dmdbchbk jdkjw 11 del 09.05 5000630739 dbcwbdj FT 9/001 DEL 13.05 5010015146 mnwd chjw FT 4 DEL 29.04.22
修改后的查询语句
SELECT carddetails FROM cc_emp_card WHERE REGEXP_LIKE(carddetails, '^(.*[^[:digit:]])?[[:digit:]]{10}([^[:digit:]].*)?$') AND NOT REGEXP_LIKE(carddetails, '[[:digit:]]{11,}');
逻辑说明
- 第一个正则表达式确保记录中存在至少一组连续的10位数字,且这组数字的前后要么是非数字字符,要么处于字符串的开头或结尾位置。
- 第二个条件直接排除所有包含11位及以上连续数字的记录——这正是原查询出现不符合预期结果的核心原因,原正则会匹配长数字里的前10位(比如14位数字的前10位),导致长数字条目被错误选中。
内容的提问来源于stack exchange,提问作者Shri Nivi
相关产品推荐
相关产品推荐

