2015-04-20 25 views
1

我有兩個表:PROD和CUST 在SQL和SYBASE中運行以下查詢時,它起作用。 Oracle沒有給出任何結果。NOT IN操作員在Oracle中無法按預期工作

select * FROM PROD 
where PROD.SECID NOT IN (SELECT CUST.SECID FROM CUST WHERE SECID <> '') 

注: PROD.SECID擁有所有空值。 CUST.SECID具有所有非空值(有效值)。

<>''不會從內部子查詢中獲取任何記錄,所以我將其更改爲非空,現在它獲取結果。

但問題是,當查詢作爲一個整體運行時,它不會給出任何結果,而應該是。

+0

「*在SQL *中運行以下查詢」沒有意義。查詢**是** SQL和Oracle **是**使用SQL。你知道Oracle沒有「空串」嗎? –

+1

一定要給拉胡爾他應得的榮譽(聲望點)。點擊答案左上角的複選標記以「接受」它作爲你問題的正確答案。祝你們好運。 – shellter

回答

1

試試這個:

select PROD.* FROM PROD LEFT JOIN CUST 
ON PROD.SECID = CUST.SECID 
+1

謝謝@Rahul。它工作 – user3346282

+0

@ user3346282: - 不客氣! –

3

NOT IN的作品,因爲它應該。如果你有空值,你不能說它是'在'給定的或不是。

SQL> select case 
    2   when null in (1, 2, 3) then 'in' 
    3   when null not in (1, 2, 3) then 'not in' 
    4   else 'null' 
    5   end as result 
    6 from dual; 

RESULT 
------ 
null  

如果要排除你應該使用not exists,或者給定的值較好,反連接:

select p.* 
from prod p, cust c 
where p.secid = c.secid (+) 
and c.secid is null; 
1

我注意到兩兩件事:

1)不爲回報如果列表中至少有一個NULL值,則返回FALSE。所以如果你的子查詢返回NULL,那麼總體查詢將返回0行。

2)。在你的子查詢無效過濾器:

WHERE SECID <> '' 

這一條款將返回0行以及'是一樣的NULL與NULL任何比較(除了IS NULL/IS NOT NULL )返回FALSE。請將其改寫爲:

WHERE SECID IS NOT NULL 
+0

不是不返回false :)在這種情況下它返回null。 –

+0

它在SQL中返回NULL,因爲SQL中不支持BOOLEAN。這沒關係。事實是操作數<>「'不起作用。我認爲更重要的是瞭解這個事實。 – Rusty

+0

它獨立於布爾支持而返回null。這在某些情況下很有用,例如在檢查限制中。關於<>''作者在第一篇文章後的幾分鐘內幾乎寫下了蝙蝠,所以他的理解是肯定的。 –