使用 `timestamp(nullif('',''))` 的目的是什么

What is the purpose of using `timestamp(nullif('',''))`

伙计们

我正在将十年前的后端从 DB2 9.5 迁移到 Oracle 19c。

我经常在 SQL 查询和查看定义中看到奇怪的 timestamp(nullif('','')) 结构,而不是普通的 null

这样做有什么意义?为什么有同样想法的人会想要这样做?

免责声明:我的 SQL 技能相当平庸。我可能会错过一些明显的东西。

它似乎创建了一个具有 TIMESTAMP 数据类型的 NULL 值。

TIMESTAMP DB2 documentation 状态:

TIMESTAMP scalar function

The TIMESTAMP function returns a timestamp from a value or a pair of values.

TIMESTAMP(expression1, [expression2])

expression1 and expression2

The rules for the arguments depend on whether expression2 is specified and the data type of expression2.

  • If only one argument is specified it must be an expression that returns a value of one of the following built-in data types: a DATE, a TIMESTAMP, or a character string that is not a CLOB.

如果您尝试将未类型化的 NULL 传递给 TIMESTAMP 函数:

TIMESTAMP(NULL)

然后你得到错误:

The invocation of routine "TIMESTAMP" is ambiguous. The argument in position "1" does not have a best fit.

要调用该函数,您需要将所需的 DATETIMESTAMP 或非 CLOB 字符串之一传递给该函数,这意味着您需要强制NULL 拥有其中一种类型。

这可能是:

TIMESTAMP(CAST(NULL AS VARCHAR(14)))
TIMESTAMP(NULLIF('',''))

使用 NULLIF 更令人困惑,但是,如果我必须尝试为使用它找借口,那么键入它比将 NULL 转换为字符串要简单一些。


Oracle 中的等价物是:

CAST(NULL AS TIMESTAMP)

这在 DB2 中也有效(并且更不用说输入)。

目前尚不清楚为什么 - 在任何 SQL 方言中,无论多么古老 - 人们都会使用像 nullif('','') 这样的论点。不管结果如何,这是一个可以一劳永逸地计算的常数,并作为参数提供给 timestamp()。很可能,它应该是 null 在任何方言和任何版本中。所以这应该与 timestamp(null) 相同。您找到的代码表明编写代码的人并不知道自己在做什么。

可能需要编写类似的东西 - 而不是普通的 null - 以获得特定数据类型的 null。即使“理论”SQL 说 null 没有数据类型,您可能需要类似的东西,例如在视图中,来定义由这样的表达式定义的列的数据类型.

在 Oracle 中,您可以使用 cast() 函数,正如 MT0 已经演示的那样 - 这是迄今为止最常见和最优雅的等价物。

如果您想要在精神上更接近您在旧代码中看到的内容,to_timestamp(null) 将具有相同的效果。没有理由为作为参数给出的 null 写一些更复杂的东西,尽管如此 - 按照 nullif() 调用的方式。