【问题标题】:How to rewrite Oracle specific function TO_NUMBER to ANSI SQL如何将 Oracle 特定函数 TO_NUMBER 重写为 ANSI SQL
【发布时间】:2019-03-15 13:52:00
【问题描述】:

有针对 Oracle 数据库运行的旧版软件。我试图将它推广到 Docker 测试中,所以我准备了一个带有数据库模式的 PostgreSQL 映像。现在我正在尝试针对 Postgres DB 运行该应用程序,但出现以下错误:

org.postgresql.util.PSQLException: ERROR: function to_number(text) does not exist

所以我查看了代码,在一些选择中发现了以下构造:

to_number(to_char({0},'HH24MI')) <= to_number(to_char({1},'HH24MI'))
to_number(to_char({0},'HH24MI')) > to_number(to_char({1},'HH24MI'))

由于我不是数据库专家,我假设这个TO_NUMBER 是一个特定于Oracle 的函数。在这种情况下,它作为过滤器返回指定时间范围内的记录。

有没有办法我可以简单地将这个TO_NUMBER 函数替换为ANSI SQL 中的一些类似函数?

【问题讨论】:

  • CAST(... AS INT)

标签: oracle postgresql ansi-sql


【解决方案1】:

代替神谕

to_number(to_char(current_timestamp, 'HH24MI'))

你可以使用这个标准的 SQL 结构:

100 * EXTRACT(HOUR   FROM current_timestamp)
    + EXTRACT(MINUTE FROM current_timestamp)

【讨论】:

  • 两种解决方案都有效,即使CAST(... AS INT) 看起来更优雅。由于这是唯一的答案,我接受它。我当然必须测试过滤器,但我认为没问题。
  • 如果你想要一个标准的SQL语句,你不能使用to_char。 PostgreSQL 恰好支持它,但它不是标准的。
  • 您必须对其进行基准测试。但我的猜测是,任何性能差异都非常小,与查询的其余成本相比,它会消失,无论查询是什么。
猜你喜欢
  • 2022-01-13
  • 2017-12-19
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 2018-08-20
  • 1970-01-01
相关资源
最近更新 更多