【发布时间】:2017-12-08 09:50:16
【问题描述】:
要求:
通用查询/函数,用于检查表中 varchar 列中提供的值是否实际上是数字且精度不超过允许的精度。
可用值:
Table_Name、Column_Name、允许的精度、允许的比例
一般建议是创建一个函数并使用 to_number() 来验证值,但它不会验证允许的长度(精度刻度)。
我的解决方案:
使用正则表达式验证号码NOT REGEXP_LIKE(COLUMN_NAME, '^-?[0-9.]+$')
验证左组件的长度(小数点前)(我不知道它的实际名称是什么)因为对于规模,oracle 会在需要时自动四舍五入。由于实际列是 varchar,我将使用 substr、instr 来查找小数点左侧的组件。
如上所述,Regexp 允许像 123...123124..55 这样的数字,我还将验证小数点的数量。 [如果 > 1 则错误]
查询无效号码:
Select * From Table_Name
Where
(NOT REGEXP_LIKE(COLUMN_NAME, '^-?[0-9.]+$')
OR
Function_To_Fetch_Left_Component(COLUMN_NAME) > (Precision-Scale)
/* Can use regexp_substr now but i already had a function for that */
OR
LENGTH(Column_Name) - LENGTH(REPLACE(Column_Name,'.','')) > 1
/* Can use regexp_count aswell*/)
我对我的解决方案感到满意和满意,直到出现只有“。”的列value 逃脱了我的支票,我看到了支票的局限性。虽然添加另一个检查来验证这一点也可以解决我的问题,但 solution 整体上看起来对我来说效率很低。
我将非常感谢[以任何方式]提供更好的解决方案。
提前致谢。
【问题讨论】: