【问题标题】:What is the purpose of using `timestamp(nullif('',''))`使用`timestamp(nullif('',''))`的目的是什么
【发布时间】:2021-12-24 07:11:54
【问题描述】:

乡亲

我正在将已有十年历史的后端从 DB2 9.5 迁移到 Oracle 19c。

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

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

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

【问题讨论】:

    标签: sql oracle db2


    【解决方案1】:

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

    TIMESTAMP DB2 documentation 声明:

    TIMESTAMP 标量函数

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

    TIMESTAMP(expression1, [expression2])
    

    表达式1和表达式2

    参数的规则取决于是否指定了表达式2以及表达式2的数据类型。

    • 如果只指定一个参数,则它必须是返回以下内置数据类型之一的值的表达式: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 中也可以使用(而且输入更少)。

    【讨论】:

    • 我认为这是创建具有null 值的任何类型的最便携和最直接的方法。
    【解决方案2】:

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

    可能需要编写类似的东西——而不是简单的null——来获得特定数据类型的null。尽管“理论上的”SQL 说 null 没有数据类型,但您可能需要类似的东西(例如在视图中)来定义由类似表达式定义的列的数据类型。

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

    如果您想要在精神上更接近您在旧代码中看到的内容,to_timestamp(null) 将具有相同的效果。不过,没有理由为作为参数的null 写一些更复杂的东西——就像nullif() 调用一样。

    【讨论】:

    • timestamp(null) DB2 中的错误The invocation of routine "TIMESTAMP" is ambiguous. The argument in position "1" does not have a best fit.
    • 感谢您的意见。根据@MTO 的建议,我会选择CAST(NULL AS TIMESTAMP) 作为最明智的选择。
    猜你喜欢
    • 1970-01-01
    • 2010-11-03
    • 2012-12-20
    • 2022-11-23
    • 1970-01-01
    • 2016-05-28
    • 2021-01-31
    • 2011-10-17
    • 2015-11-17
    相关资源
    最近更新 更多