Oracle regexp_类从视图中执行浮点操作失败

Oracle regexp_类从视图中执行浮点操作失败,oracle,view,regexp-like,Oracle,View,Regexp Like,我正在尝试使用regexp\u查找和删除过于精确的浮点数 select c from t order by c asc; 返回许多类似以下内容的结果:0.0000000012345678 像使用regexp_一样,我可以得到小数点后两位(0.25)的结果: 但是,当我尝试两个以上的地方时,我没有得到任何结果: select * from t where REGEXP_LIKE(c,'^\d+\.\d{3}'); ... select * from t where REGEXP_LIKE(c,'

我正在尝试使用regexp\u查找和删除过于精确的浮点数

select c from t order by c asc;
返回许多类似以下内容的结果:0.0000000012345678

像使用regexp_一样,我可以得到小数点后两位(0.25)的结果:

但是,当我尝试两个以上的地方时,我没有得到任何结果:

select * from t where REGEXP_LIKE(c,'^\d+\.\d{3}');
...
select * from t where REGEXP_LIKE(c,'^\d+\.\d{10}');

唯一的添加信息是,我在第二个视图的视图中进行选择,并且我正在搜索的列(上面的c)被指定为浮点。

您可以将它们视为数字。您可以将该值设置为固定的小数位数:

TRUNC
(number)函数返回被截断为n2位的n1位小数

然后看看是否匹配。例如,要查找小数点后有两个以上有效数字的任何值,请执行以下操作:

 select * from t where c != trunc(c, 2);
select * from t where REGEXP_LIKE(c,'^\d*\.\d{10}');
或查找有效位数超过10位的数字:

 select * from t where c != trunc(c, 10);
我用了
=而不是
,以防出现负值

您还可以将其用作删除/更新中的过滤器,或者作为更新中的
设置
部分,如果您希望降低精度,尽管在这种情况下,您可能希望使用
round()
而不是
trunc()


当您像
一样使用
regexp\u时,您正在将浮点值隐式转换为字符串,请注意:

如果省略fmt,则n将转换为一个足够长的
VARCHAR2
值,以保持其有效数字

这意味着0.25成为字符串
'.25'
,没有前导零;连你的第一个图案都不匹配

您可以使用
*
而不是
+
来允许前导零不存在,例如,查找小数点后至少有10位有效数字的值:

 select * from t where c != trunc(c, 2);
select * from t where REGEXP_LIKE(c,'^\d*\.\d{10}');
或者正好有10个:


等等,。;但是把它们当作数字而不是字符串来对待似乎更简单。

你的值是小数点后正好有3位还是正好有10位?如果它们是浮点数(数字),为什么要尝试使用字符串函数对它们进行过滤?您确定您甚至匹配了0.25吗?我可以看到1.25起作用,但是您正在执行的隐式
to_char(c)
在小数点之前不会有零?是的,有一些条目有1-15个小数位。我想你的trunc()会有用的。现在试试,谢谢。