2017-03-07 140 views
0

當查詢結果爲空但查詢仍然返回null時,我試圖顯示00001。我不知道我的查詢有什麼問題。SQL ISNULL不起作用

編輯:

假設OBRNo123-5678-10-13-1619裝置LEN(a.OBRNo) is 19

SELECT TOP 1 CASE WHEN RIGHT(a.OBRNo, 5) = NULL THEN '00001' ELSE a.OBRNo 
END as CaseWhen, 
ISNULL(a.OBRNo, '00001') as ISNULL, 
RIGHT(OBRNo, 5) as OrderBy 
FROM tbl_T_BMSCurrentControl as a 
WHERE LEN(a.OBRNo) = 20 and a.ActionCode = 1 
ORDER BY OrderBy DESC 

enter image description here

+2

我不知道一個NULL結果匹配'WHERE LEN (a.OBRNo)= 20' – devio

+0

我會首先確保'a.OBRNo'不是一個空字符串 – anatol

+1

查詢不返回null - 它不返回*任何*。 'isnull'不能創建沒有的行。並且它永遠不會返回任何空的'a.OBRNo'值,因爲你用'len(a.OBRNo)= 20'來過濾,這對於一個空值將永遠是虛假的(即使它不會,它仍然肯定不會是20 :))。您可能需要檢查空值在ANSI SQL中的工作方式 - 正確的做法非常重要。 – Luaan

回答

4

NULL比較與IS NULL/IS NOT NULL,不與= NULL

SELECT TOP 1 CASE WHEN RIGHT(a.OBRNo, 5) IS NULL THEN '00001' ELSE a.OBRNo END 
... 

您可以用SET ANSI_NULLS更改此行爲。

您無法與默認值=進行比較的原因是:NULL表示未定義。沒有什麼等於未知,甚至不是NULL。如果與NULL比較,結果是未知的,因此也是NULL

+1

我認爲這個問題是關於另一個案件 - 'ISNULL(a.OBRNo,'00001')作爲ISNULL' – anatol

+0

@anatol不,這是關於OP對結果的誤解 - 他沒有結果,也沒有結果。正如Tim指出的那樣,原因是錯誤的過濾器。 – Luaan

1

查詢是否返回任何行?

您的ISNULL (x,y)應該做你期望的,但看起來你的WHERE正在過濾所有的記錄,由於NULLS

試試這個:

SELECT TOP 1 CASE WHEN RIGHT(a.OBRNo, 5) = NULL THEN '00001' ELSE a.OBRNo 
END as CaseWhen, 
ISNULL(a.OBRNo, '00001') as ISNULL, 
RIGHT(OBRNo, 5) as OrderBy 
FROM tbl_T_BMSCurrentControl as a 
WHERE (a.OBRNo IS NULL OR LEN(a.OBRNo) = 20) and a.ActionCode = 1 
ORDER BY OrderBy DESC 

LEN(a.OBRNo)a.OBRNo NULLNULL所以NULL = 20NULLNULL AND a.ActionCode = 1NULL,當過濾視爲FALSE