正在验证数字oracle-sql中的位数



我想验证数字的位数,这样我就可以检查它们是否符合提供的规则(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}

最新更新