使用 `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.
要调用该函数,您需要将所需的 DATE
、TIMESTAMP
或非 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()
调用的方式。
伙计们
我正在将十年前的后端从 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
, aTIMESTAMP
, or a character string that is not aCLOB
.
如果您尝试将未类型化的 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 中的等价物是:
CAST(NULL AS TIMESTAMP)
这在 DB2 中也有效(并且更不用说输入)。
目前尚不清楚为什么 - 在任何 SQL 方言中,无论多么古老 - 人们都会使用像 nullif('','')
这样的论点。不管结果如何,这是一个可以一劳永逸地计算的常数,并作为参数提供给 timestamp()
。很可能,它应该是 null
在任何方言和任何版本中。所以这应该与 timestamp(null)
相同。您找到的代码表明编写代码的人并不知道自己在做什么。
可能需要编写类似的东西 - 而不是普通的 null
- 以获得特定数据类型的 null
。即使“理论”SQL 说 null
没有数据类型,您可能需要类似的东西,例如在视图中,来定义由这样的表达式定义的列的数据类型.
在 Oracle 中,您可以使用 cast()
函数,正如 MT0 已经演示的那样 - 这是迄今为止最常见和最优雅的等价物。
如果您想要在精神上更接近您在旧代码中看到的内容,to_timestamp(null)
将具有相同的效果。没有理由为作为参数给出的 null
写一些更复杂的东西,尽管如此 - 按照 nullif()
调用的方式。