2016-11-14 16 views
-1

我行如下圖所示NVL列和NULL

ProductId ProductName  ProductDesc  ProductLoc 
101   Camel    Pencil   B-10 
102   Parker   Pen    
103   Mirado   Pen    C-10 

當我執行下面的SQL查詢

SELECT * 
    FROM tablename 
WHERE productloc = NVL ('', productloc) 

它給我的第1和第3行,我想實現的是什麼如果productloc在SQL的where條件中爲空,那麼我應該得到所有三行。

如何獲得所需的輸出。

+2

hmm..You與productloc來自同一table..Why比較productloc?如果你刪除where語句,你會得到所有的行。 –

+0

保持nvl雙方。 – Buddi

+1

'NVL('',productloc)'總是返回'productloc',因爲''''等於'null'在Oracle中 – Kacper

回答

1

select * from tablename;

是你在這種情況下需要,因爲你的地方沒有任何效果。你比較列與自己。

如果要篩選,包括空你可以做(​​但可能有一定的價值代替一個productloc

select * from tablename where productloc = productloc or productloc is null;

或者:

select * from tablename where nvl(productloc, 'SOME_UNIQUE_VAL') = nvl(productloc, 'SOME_UNIQUE_VAL');

,並同時更換的一個productloc由某個值。

1

嘗試類似:

SELECT * 
    FROM tablename 
WHERE nvl(productloc,'zzz') = (case when productloc is null then 'zzz' else productloc end) 

這裏ZZZ是一些虛擬的價值,否則不應該存在於特定的列值。

1

我假設有三個不同的解決方案:

如果你想要的所有行(與productloc空和價值),您可以編寫以下查詢:

SELECT * 
FROM tablename 

沒有WHERE條款。

如果你想與productloc提取所有行都有一個指定的值或爲空,所以你可以寫下面的查詢:

SELECT * 
FROM tablename 
WHERE productloc IS NULL OR productloc = YOURVARIABLE 

或(最後,不使用OR條件)

SELECT * 
FROM tablename 
WHERE NVL(productloc, YOURVARIABLE) = YOURVARIABLE 
1

I a你正在使用Oracle。在Oracle中,「NULL」不是一個值,因爲它的任何比較函數都會返回false。

我建議:

SELECT * 
    FROM tablename 
WHERE (productloc = productloc OR productloc IS NULL) 

希望它能幫助,
塞爾吉奧