代码之家  ›  专栏  ›  技术社区  ›  User1

Postgres将字符串转换为数字

  •  2
  • User1  · 技术社区  · 15 年前

    我有一个带有varchar字段的数百万行表。varchar的一些行是浮点数。对其他字段没有约束,这些字段可以完全隔离哪些行是数字,哪些行不是数字。我想在varchar字段中具有数值的行上创建ORDER BY查询(忽略非数字)。我不能简单地调用myfield::numeric,因为它在非数字行上吐。

    我想到了两个基本的选择:
    (A)使用regex确定行是否为数字。
    (B)捕获强制转换异常,并为所有非数字值返回空值。

    速度至关重要。我试过选择(A),但速度很慢。我创建了一个存储过程来使用regex在转换前检查值。非数字返回为空。我使用那个存储过程创建了一个索引。瑞格鞋太贵了。但我想知道,捕获一个异常是否值得这么做。

    对于非数字数据,是否有一种简单的方法让myfield::numeric返回空值?有什么建议可以让这个跑得更快吗?

    谢谢

    2 回复  |  直到 15 年前
        1
  •  1
  •   Jon Skeet    15 年前

    模式是固定的,还是可以更改?特别是,您是否可以添加另一个(可以为空)列来存储浮点值(如果有的话)?然后,插入/更新的触发器可以确保数值列始终具有正确的值。当然,这假设您将比插入/更新更频繁地进行查询。

        2
  •  1
  •   Peter Eisentraut    15 年前

    对于速度,我将使用一个由触发器更新的数值类型保持单独的列的解决方案。空的不浪费任何空间。否则,带有存储过程(或case表达式)的解决方案将检查该值,然后对其进行正确的强制转换。捕获异常可能是所有异常中最昂贵的解决方案。