有沒有。雖然我問Oracle數據庫中的情況下('xyz' != 'xyz')
和NOT ('xyz' = 'xyz')
(「某某」!=「某某」),而不是(「某某」 =「某某」)之間有什麼區別
之間的任何差別,但也想知道其他語言的相同情況。
差異主要是像處理速度和所有背景的東西。
有沒有。雖然我問Oracle數據庫中的情況下('xyz' != 'xyz')
和NOT ('xyz' = 'xyz')
(「某某」!=「某某」),而不是(「某某」 =「某某」)之間有什麼區別
之間的任何差別,但也想知道其他語言的相同情況。
差異主要是像處理速度和所有背景的東西。
您是否看到有什麼不同?
測試用例:
SQL> SELECT * FROM dual
2 WHERE ('xyz' != 'xyz');
no rows selected
SQL>
SQL> SELECT * FROM dual
2 WHERE NOT ('xyz' = 'xyz');
no rows selected
在上述查詢兩者應用的濾波器是相同濾波器(NULL IS NOT NULL)。
執行計劃:
SQL> EXPLAIN PLAN FOR
2 SELECT * FROM dual
3 WHERE ('xyz' != 'xyz');
Explained.
SQL>
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3752461848
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 0 (0)| |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------
1 - filter(NULL IS NOT NULL)
14 rows selected.
SQL>
SQL> EXPLAIN PLAN FOR
2 SELECT * FROM dual
3 WHERE NOT ('xyz' = 'xyz');
Explained.
SQL>
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3752461848
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 0 (0)| |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------
1 - filter(NULL IS NOT NULL)
14 rows selected.
SQL>
沒有區別。
嗯......你似乎認爲OP在詢問字面值「xyz」,這沒有多大意義(顯然「xyz」等於''xyz'')。在你的情況下,優化器能夠完全消除謂詞,但這只是因爲表達式只有字面值。誠然,這個問題措辭不佳。 – 2015-03-03 13:43:58
我完全同意你的看法。 OP的問題太籠統了。只要證明'1 = 1'總是對的就沒有太大困難;-)我希望這個問題在一個更具體的用例中是否是關於** NOT **的具體問題。這就是我添加解釋計劃的原因。 – 2015-03-03 13:53:16
這就是爲什麼我傾向於在提問前提出澄清問題的答案:) – 2015-03-03 13:54:01
正如你所看到的,從拉利特的回答中,答案顯然是「否」,因爲你的字面值是相同的。我懷疑你實際上是指更一般的情況,例如'(:bind1!=:bind1)'vs'NOT(:bind1 =:bind1)' - 我說得對嗎? – 2015-03-03 13:45:53
其實,我的意思是確實是更一般的情況。而且與其他一些語言相比也是如此。 – Sachin 2015-03-03 13:47:58
答案是一樣的:if:bind不爲null,兩個表達式的結果都爲TRUE。如果:bind爲null,則兩個表達式的結果都是UNKNOWN。 – 2015-03-03 13:53:02