乡亲们我正在将一个已有十年历史的后端从DB2 9.5迁移到Oracle 19c。我经常看到在SQL查询和视图定义中使用奇怪的timestamp(nullif('',''))结构而不是普通的null。这样做有什么意义?为什么有同样想法的人会想这样做?免责声明:我的SQL技能相当平庸。我很可能会错过一些明显的东西。
timestamp(nullif('',''))
null
vptzau2j1#
它似乎创建了一个具有TIMESTAMP数据类型的NULL值。TIMESTAMP DB2 documentation声明:
TIMESTAMP
NULL
TIMESTAMP函数从一个值或一对值返回时间戳。
TIMESTAMP(expression1, [expression2])
参数的规则取决于是否指定了expression2以及expression2的数据类型。
DATE
CLOB
如果您尝试将不具类型的NULL传递给TIMESTAMP函数:
TIMESTAMP(NULL)
然后,您会看到错误:
The invocation of routine "TIMESTAMP" is ambiguous. The argument in position "1" does not have a best fit.
要调用该函数,需要将所需的DATE、TIMESTAMP或非CLOB字符串之一传递给该函数,这意味着需要强制NULL具有这些类型之一。这可能是:
TIMESTAMP(CAST(NULL AS VARCHAR(14))) TIMESTAMP(NULLIF('',''))
使用NULLIF更容易混淆,但如果我不得不为使用它找个借口,那么它比将NULL转换为字符串稍微不那么容易键入。在Oracle中的对等用法为:
NULLIF
CAST(NULL AS TIMESTAMP)
这在DB2中也是有效的(甚至更不需要键入)。
m4pnthwp2#
不清楚为什么在任何SQL方言中,不管有多古老,都会使用nullif('','')这样的参数。不管结果如何,这是一个可以一次性计算的常数,并作为timestamp()的参数给出。很可能,它应该是null,在任何方言和任何版本中都是这样。所以它应该与timestamp(null)相同。您找到的代码表明编写它的人不知道他们在做什么。要获得特定数据类型的null,可能需要编写类似的代码(而不是普通的null)。尽管“理论上”SQL说null没有数据类型,但您可能需要类似的代码(例如在视图中)来定义由类似表达式定义的列的数据类型。在Oracle中,您可以使用cast()函数,正如MT 0已经演示过的那样--这是迄今为止最常见、最简洁的等效函数。如果你想在精神上更接近于你在旧代码中看到的东西,to_timestamp(null)也会有同样的效果。尽管没有理由为null编写更复杂的东西,但作为参数--沿着nullif()调用的路线。
nullif('','')
timestamp()
timestamp(null)
cast()
to_timestamp(null)
nullif()
2条答案
按热度按时间vptzau2j1#
它似乎创建了一个具有
TIMESTAMP
数据类型的NULL
值。TIMESTAMP
DB2 documentation声明:TIMESTAMP标量函数
TIMESTAMP函数从一个值或一对值返回时间戳。
表达式1和表达式2
参数的规则取决于是否指定了expression2以及expression2的数据类型。
DATE
、TIMESTAMP
或不是CLOB
的字符串。如果您尝试将不具类型的
NULL
传递给TIMESTAMP
函数:然后,您会看到错误:
要调用该函数,需要将所需的
DATE
、TIMESTAMP
或非CLOB
字符串之一传递给该函数,这意味着需要强制NULL
具有这些类型之一。这可能是:
使用
NULLIF
更容易混淆,但如果我不得不为使用它找个借口,那么它比将NULL
转换为字符串稍微不那么容易键入。在Oracle中的对等用法为:
这在DB2中也是有效的(甚至更不需要键入)。
m4pnthwp2#
不清楚为什么在任何SQL方言中,不管有多古老,都会使用
nullif('','')
这样的参数。不管结果如何,这是一个可以一次性计算的常数,并作为timestamp()
的参数给出。很可能,它应该是null
,在任何方言和任何版本中都是这样。所以它应该与timestamp(null)
相同。您找到的代码表明编写它的人不知道他们在做什么。要获得特定数据类型的
null
,可能需要编写类似的代码(而不是普通的null
)。尽管“理论上”SQL说null
没有数据类型,但您可能需要类似的代码(例如在视图中)来定义由类似表达式定义的列的数据类型。在Oracle中,您可以使用
cast()
函数,正如MT 0已经演示过的那样--这是迄今为止最常见、最简洁的等效函数。如果你想在精神上更接近于你在旧代码中看到的东西,
to_timestamp(null)
也会有同样的效果。尽管没有理由为null
编写更复杂的东西,但作为参数--沿着nullif()
调用的路线。