如何在Oracle中评估以下表达式?
WHERE nvl(MODIFIEDDATE, TO_DATE('2030/01/01', 'YYYY/MM/DD HH24:MI:SS'))
> TO_DATE('', 'YYYY/MM/DD HH24:MI:SS')
任何人都可以解释这会做什么吗?我不是甲骨文的人。
答案 0 :(得分:2)
您正在将日期与NULL进行比较。
此:
nvl(MODIFIEDDATE,TO_DATE(' 2030/01/01',' YYYY / MM / DD HH24:MI:SS'))
意味着,只要MODIFIEDDATE
为NULL,就使用日期值。
SQL> alter session set nls_date_format='YYYY/MM/DD HH24:MI:SS';
Session altered.
SQL> SELECT TO_DATE('2030/01/01', 'YYYY/MM/DD HH24:MI:SS') LHS, TO_DATE('', 'YYYY/MM/DD HH24:MI:SS') RHS FROM dual;
LHS RHS
------------------- -------------------
2030/01/01 00:00:00
SQL>
因此,基本上,将任何与NULL进行比较的结果都是......"未知"。因此,您的查询将不返回任何内容。
答案 1 :(得分:1)
条件的前半部分:
nvl(MODIFIEDDATE, TO_DATE('2030/01/01', 'YYYY/MM/DD HH24:MI:SS'))
...表示如果MODIFIEDDATE
列为空,则会使用2030-01-01的魔术日期。
条件的后半部分:
TO_DATE('', 'YYYY/MM/DD HH24:MI:SS')
...将始终评估为null。除了使用is [not] null
运算符之外,Null无法与包括其自身在内的任何其他值进行比较。
此条件的结果将始终为“未知”,因此不会返回任何行。
它将排除所有行,而不仅仅是那些具有空日期的行; nvl()
意味着无论如何都会给任何空值赋值。如果您只想排除具有空日期的日期,则可以指定WHERE MODIFIEDDATE IS NOT NULL
,但不清楚该代码的用途是什么。
答案 2 :(得分:1)
让我们详细介绍一下:
NVL(MODIFIEDDATE, TO_DATE('2030/01/01', 'YYYY/MM/DD HH24:MI:SS'))
如果它不是NULL,则返回MODIFIEDDATE
。如果MODIFIEDDATE
为NULL,则它将返回DATE
值2030/01/01 00:00:00
(时间组件将默认为午夜,因为它未在'2030/01/01'的时间字面中指定) 。所以这将始终返回非NULL DATE值。
TO_DATE('', 'YYYY/MM/DD HH24:MI:SS')
这将始终返回NULL。 Oracle中的零长度字符串表示NULL
。这是设计的(可以追溯到Oracle的最早期),并且是IMO在Oracle产品中的最差设计决策之一。但它就是这样 - Oracle中的零长度字符串是NULL,永远是永远的。并且NULL是有毒的,因此TO_DATE(NULL, 'YYYY/MM/DD HH24:MI:SS')
将返回NULL。
所以现在我们已经
了SOME_VALID_DATE_VALUE > NULL
这将始终返回NULL,因为与NULL的任何比较都返回NULL(记住 - NULL是有毒的)。所以WHERE子句变为
WHERE NULL...
因此使用此WHERE子句的查询将不返回任何行。
分享并享受。