Dio*_*cia 0 sql oracle oracle11g
有谁知道为什么有时甲骨文对null价值观有奇怪的行为?
例如,当我选择以下查询时,第一行被排除,但 null 显然不像“Test”字符串:
SELECT A.NAME FROM (
SELECT NULL AS NAME FROM DUAL
UNION SELECT 'Name 1' AS NAME FROM DUAL
UNION SELECT 'Name 2' AS NAME FROM DUAL
UNION SELECT 'Name 3' AS NAME FROM DUAL
UNION SELECT 'Name 4' AS NAME FROM DUAL
UNION SELECT 'Name 5' AS NAME FROM DUAL
) A WHERE UPPER(A.NAME) NOT LIKE UPPER('Test') --THIS RULE EXCLUDE DE FIRST ROW WITH NAME NULL NULL NAME
Run Code Online (Sandbox Code Playgroud)
我使用的是 Oracle 版本 11:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
"CORE 11.2.0.4.0 Production"
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
Run Code Online (Sandbox Code Playgroud)
有人对此有什么想法吗?
简而言之,NULL 不等于任何东西,包括它本身。
也就是说,与 DECODE 函数进行 NULL 比较可能具有欺骗性。在比较 NULL 值而不是“=”时,DECODE 的行为就好像使用“IS NULL”运算符。例如:
SQL> SELECT DECODE(NULL, NULL, 'Equal', 'Not Equal') result FROM dual;
RESULT
------
Equal
Run Code Online (Sandbox Code Playgroud)
如今,CASE 语句由于其清晰性而往往比 DECODE 更受青睐。即便如此,我认为这仍然值得一提,因为 DECODE 经常出现在遗留代码中 - 并且有些人在编写简单比较时仍然使用它来保持紧凑性。