我想验证数字的位数,这样我就可以检查它们是否符合提供的规则(9,6(;
- 总共不超过9位
- 点前最多3位
- 点后最多6位数字
例如,列A具有以下值;
- 123.456434->校正
- 12.4535->校正
- 13234.3543->不正确(小数点前多个数字(
- 13.44757832->不正确(点后多个数字(
在之前的一次测试中,我只用下面的sql测试了点后面的数字;
选择列a,长度时大小写(regexp_substr(column_a,'\d+$'(>(9,6(然后"不正常"其他"OK"结束列测试来自表
然而,这似乎不适用于检查点之前的数字。如何调整sql,使其同时测试点前后的数字?
如果我理解正确:
select . . . ,
(case when regexp_like(column_a, '^[0-9]{0-3},[0-9]{0-6}$')
then 'OK' else 'NOT OK'
end)
这假设逗号是必需的。如果没有,请使用'^[0-9]{0-3}[,]?[0-9]{0-6}$'
。
在长度检查时,您需要注意调整后的带有可选小数点的问题。
您不能在正则表达式[.]?
中将其设置为简单可选,因为这将接受长整数,例如1000
只需在regexp中使用两个选项,其中一个没有小数点^[[:digit:]]{0,3}$
另一个是^[[:digit:]]{0,3}[.][[:digit:]]{0,6}$
样本查询
select num,
case when regexp_like(num, '(^[[:digit:]]{0,3}$|^[[:digit:]]{0,3}[.][[:digit:]]{0,6}$)' )
then 'OK' else 'NOT OK'
end as is_ok
from tab;
NUM IS_OK
---------- ------
123.45643 OK
12.4535 OK
13234.3543 NOT OK
13.4757832 NOT OK
13,475 NOT OK
38383 NOT OK
100 OK
还要注意,出现运算符的正确语法是{m,n}
,而不是{m-n}