我有一个带有varchar字段的数百万行表。 varchar的一些行是浮点数。其他字段没有约束可以完全隔离哪些行是数字而哪些不是。我想在varchar字段中使用数值创建带有ORDER BY的查询(忽略非数字)。我不能简单地调用MyField :: numeric,因为它会对非数字行进行调用。
我想到了两个基本选择:
(a)使用正则表达式来确定该行是否为数字
(b)捕获强制转换异常并为所有非数字值返回null。
速度至关重要。我尝试了选项(a),但速度很慢。我创建了一个存储过程来使用正则表达式来检查强制转换之前的值。非数字返回null。我使用该存储过程创建了一个索引。正则表达式是如此昂贵。但是我想知道捕捉异常是否值得付出努力。
是否有一种简单的方法让MyField :: numeric为非数字数据返回空值?有什么建议可以让它跑得更快吗?
由于
答案 0 :(得分:1)
架构是固定的,还是可以更改?特别是你可以添加另一个(可为空)列来存储浮点值,如果有的话?然后,插入/更新的触发器可以确保数字列始终具有正确的值。这假设您将比插入/更新当然更频繁地查询。
答案 1 :(得分:1)
对于速度,我会采用保持单独列的解决方案,该列具有由触发器更新的数字类型。 Nulls不会浪费任何空间。否则,具有存储过程(或案例表达式应该足够)的解决方案将检查该值,然后将其转换为正确。捕获异常可能是他们所有人中最昂贵的解决方案。