问题描述
我想验证数字的位数,以便检查它们是否遵循提供的规则(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}