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

thigvfpy  于 2022-11-07  发布在  DB2
关注(0)|答案(2)|浏览(191)

乡亲们
我正在将一个已有十年历史的后端从DB2 9.5迁移到Oracle 19c。
我经常看到在SQL查询和视图定义中使用奇怪的timestamp(nullif('',''))结构而不是普通的null
这样做有什么意义?为什么有同样想法的人会想这样做?
免责声明:我的SQL技能相当平庸。我很可能会错过一些明显的东西。

vptzau2j

vptzau2j1#

它似乎创建了一个具有TIMESTAMP数据类型的NULL值。
TIMESTAMP DB2 documentation声明:

TIMESTAMP标量函数

TIMESTAMP函数从一个值或一对值返回时间戳。

TIMESTAMP(expression1, [expression2])

表达式1和表达式2

参数的规则取决于是否指定了expression2以及expression2的数据类型。

  • 如果只指定了一个参数,则该参数必须是返回以下内置数据类型之一的值的表达式:DATETIMESTAMP或不是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中也是有效的(甚至更不需要键入)。

m4pnthwp

m4pnthwp2#

不清楚为什么在任何SQL方言中,不管有多古老,都会使用nullif('','')这样的参数。不管结果如何,这是一个可以一次性计算的常数,并作为timestamp()的参数给出。很可能,它应该是null,在任何方言和任何版本中都是这样。所以它应该与timestamp(null)相同。您找到的代码表明编写它的人不知道他们在做什么。
要获得特定数据类型的null,可能需要编写类似的代码(而不是普通的null)。尽管“理论上”SQL说null没有数据类型,但您可能需要类似的代码(例如在视图中)来定义由类似表达式定义的列的数据类型。
在Oracle中,您可以使用cast()函数,正如MT 0已经演示过的那样--这是迄今为止最常见、最简洁的等效函数。
如果你想在精神上更接近于你在旧代码中看到的东西,to_timestamp(null)也会有同样的效果。尽管没有理由为null编写更复杂的东西,但作为参数--沿着nullif()调用的路线。

相关问题