2015-08-17 20 views
-2

我有一個查詢工作在MSSQL是這樣的:使用ISNULL功能是不會放棄應有的價值

select company_id,isshowable from company where company_id in (1,2);

它會給結果一樣:

company_id | isshowable  
     1  | NULL 
     2  | true 

這裏,COMPANY_ID 1具有isshowable = NULL值。當我申請了isnull功能與此查詢:

select isshowable, company_id 
from company 
where company_id in (1,2) 
    and (isshowable='true' OR isshowable = ISNULL(isshowable,'true'));             

它給唯一一個已COMPANY_ID = 2.爲什麼ISNULL函數而不是取代與「真」 NULL值的記錄?

我的要求是兩個記錄都應該從數據庫中提取,而NULL值應該用'true'代替。

什麼應該是實現這一目標的正確方法?

回答

1

因爲NULL <>'true'

WHERE條款:如果isshowableNULL

isshowable = ISNULL(isshowable, 'true')) 

返回false。請記住ISNULL函數返回第二個參數,如果第一個參數是NULL。所以在這種情況下,您的ISNULL返回true。但是等式的左邊還是NULL,所以就成了:

`NULL` = 'true' 

,正如你知道的,是false,爲WHERE條款的目的。 (請注意,SQL Server使用三值邏輯,所以NULL =假是真的=未知)

實現你想要的結果,你WHERE條款應該是:

WHERE 
    company_id in (1,2) 
    AND (isshowable = 'true' OR isshowable IS NULL) 
+1

'UNKNOWN',不' FALSE'。用'NOT()'包裝這些表達式並且觀察它們不變成'TRUE'很容易證明。 SQL使用三值邏輯。 –

+0

哎呀,我的壞。我爲什麼想念那個?謝謝 –

+0

謝謝felix與help.it是我的錯誤理解。謝謝 –