验证数字oracle sql

问题描述

我想验证数字的位数,以便检查它们是否遵循提供的规则(9,6);

  • 总共不超过9位数字
  • 点前最多3位数字
  • 点后最多6位数字

例如,列A具有以下值;

  • 123.456434->正确
  • 12.4535->正确
  • 13234.3543->不正确(点前很多数字)
  • 13.4757832->不正确(点后很多位数)

在以前的测试中,我仅使用以下sql测试了点后的数字;

选择column_a ,当length(regexp_substr(column_a,'\ d + $'))>(9,6)时为'Not OK' 否则“确定” 结束column_a_test 从表中

但是,这似乎无法检查点之前的数字。如何调整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}$'

,

您所选择的带有小数点可选的问题需要仔细检查长度。

您不能在regexp [.]?中将其设置为简单的可选,因为它将接受长整数,例如1000

在正则表达式中简单使用两个选项,一个不带小数点^[[:digit:]]{0,3}$

,另一个^[[:digit:]]{0,3}[.][[:digit:]]{0,6}$

示例查询

select num,case when regexp_like(num,'(^[[: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  

还要注意,correct syntax的发生符是{m,n}而不是{m-n}