2017-03-07 29 views
0

クエリ結果がnullでもクエリがnullを返す場合は00001と表示しようとしています。私は私の質問に何が間違っているのか分からない。SQL ISNULLが機能しません

EDIT:

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になります私はNULLの結果は 'WHERE LEN一致するか疑問(a.OBRNo)= 20' – devio

+0

'a.OBRNo'は空文字列ではないと最初に気になります。 – anatol

+1

クエリはnullを返しません。何も返されません。 'isnull'は行が存在しない行を作成できません。 'len(a.OBRNo)= 20'でフィルタリングしているので、null値のa.OBRNo'値を返すことはできません。これは常にnull値に対して偽であり(そうでなくても、それはまだ確かに20ではないだろう:))。 ANSI SQLでNULLがどのように機能するかを調べることができます。正しいことを得ることは非常に重要です。 – Luaan

答えて

4

を意味しない= NULLで、IS NULL/IS NOT NULLNULLと比較してください。

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')as ISNULL」 – anatol

+0

@anatolいいえ、それはOPの誤解です。結果は得られません。その理由は、Timが指摘しているように、欠陥のあるフィルタです。 – Luaan

1

クエリの行は返されますか?

お客様のISNULL (x,y)は、のために、WHEREがすべてのレコードをフィルタリングしているようです。

はこれを試してみてください:

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 NULLはそうNULL = 20NULLNULL AND a.ActionCode = 1なりますNULLになりますであることはフィルタリングするときはFALSE

関連する問題