2015-03-03 128 views
2

有沒有。雖然我問Oracle數據庫中的情況下('xyz' != 'xyz')NOT ('xyz' = 'xyz')(「某某」!=「某某」),而不是(「某某」 =「某某」)之間有什麼區別

之間的任何差別,但也想知道其他語言的相同情況。

差異主要是像處理速度和所有背景的東西。

+0

正如你所看到的,從拉利特的回答中,答案顯然是「否」,因爲你的字面值是相同的。我懷疑你實際上是指更一般的情況,例如'(:bind1!=:bind1)'vs'NOT(:bind1 =:bind1)' - 我說得對嗎? – 2015-03-03 13:45:53

+0

其實,我的意思是確實是更一般的情況。而且與其他一些語言相比也是如此。 – Sachin 2015-03-03 13:47:58

+0

答案是一樣的:if:bind不爲null,兩個表達式的結果都爲TRUE。如果:bind爲null,則兩個表達式的結果都是UNKNOWN。 – 2015-03-03 13:53:02

回答

0

您是否看到有什麼不同?

測試用例:

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> 

沒有區別。

+0

嗯......你似乎認爲OP在詢問字面值「xyz」,這沒有多大意義(顯然「xyz」等於''xyz'')。在你的情況下,優化器能夠完全消除謂詞,但這只是因爲表達式只有字面值。誠然,這個問題措辭不佳。 – 2015-03-03 13:43:58

+0

我完全同意你的看法。 OP的問題太籠統了。只要證明'1 = 1'總是對的就沒有太大困難;-)我希望這個問題在一個更具體的用例中是否是關於** NOT **的具體問題。這就是我添加解釋計劃的原因。 – 2015-03-03 13:53:16

+0

這就是爲什麼我傾向於在提問前提出澄清問題的答案:) – 2015-03-03 13:54:01