2

我正在尝试将一些查询从 Oracle 环境转换为 Postgres。这是其中一个查询的简化版本:

SELECT * FROM TABLE
  WHERE REGEXP_LIKE(TO_CHAR(LINK_ID),'\D')

我相信等效的 postgreSQL 应该是这样的:

SELECT * FROM TABLE
    WHERE CAST(LINK_ID AS TEXT) ~ '\D'

但是当我在它们各自的环境中对完全相同的数据集运行这些查询时,第一个查询不输出任何记录(这是正确的),第二个查询输出表中的所有记录。我没有编写原始代码,但据我了解,它正在寻找数字字段 LINK_ID 中非数字字符的任何值。\D 元字符在 Oracle 和 postgres 中的行为是否应该不同?我在文档中没有看到任何东西说他们应该这样做。

4

1 回答 1

1

OracleTO_CHAR(number)状态的文档

如果省略 fmt,则 n 将转换为 VARCHAR2 值,其长度正好足以容纳其有效数字。

这意味着唯一可能产生的非数字字符是负号或小数点。如果数字是正数并且没有小数部分,它将与正则表达式不匹配\D

另一方面,在 PostgreSQL 上CAST(numeric(38,8)as TEXT)返回一个值,其小数位数由类型规范指定,在本例中为 8。例如:

cast( cast(12341234 as numeric(38,8)) as TEXT)

生成12341234.00000000此类转换的结果将始终包含小数点,因此将始终与正则表达式匹配\D

您可能会发现用它替换它可以解决您的问题:

(LINK_ID % 1) <> 0.0

或者,如果您需要使用正则表达式(例如,简化迁移工作),请考虑将其更改为'\.0*[1-9]'ie 以查找其后有任何非零数字的小数点。

于 2018-05-04T14:34:39.473 回答