SQL表列校验如何用REGEXP_LIKE仅匹配数字和指定n.v.类合法值?
问题解决说明
错误原因
你之前的正则表达式错误使用了[]字符组语法:字符组只会匹配单个符合规则的字符,你把所有合法组合都写在字符组内,会被拆解为n/v/N/V/./,/数字这些可单独匹配的单个字符,再配合+(匹配1次及以上)规则,自然会出现单个n/v/N/V/点都能匹配成功的误判问题。
修正后查询代码
select count(*) from table1 where column1 is null or not REGEXP_LIKE(column1, '^([0-9]+|nv|n\\.v)$', 'i');
规则说明
修正后的正则完全匹配你的合法值要求:
- 用
^和$强制匹配整个字段值,避免部分匹配的误判 - 分组内用
|分隔两类合法值:- 纯数字:
[0-9]+匹配1位及以上的纯数字内容 - 合法字符串:配合第三个参数
i开启不区分大小写匹配,nv匹配所有大小写组合的无点字符串,n\.v匹配所有大小写组合的中间带点字符串,完全覆盖你列出的8种合法字符串场景,不会匹配单个字符
- 纯数字:
如果你的需求中允许n.v.(末尾带点)的格式,只需将正则调整为^([0-9]+|nv|n\\.v\\.?)$即可覆盖v后带点/不带点的场景。
内容的提问来源于stack exchange,提问作者Phil Gee
相关产品推荐
相关产品推荐

