2017-05-02 10 views
1

次のクエリでは、注文があったかどうかにかかわらず、すべての現在/将来の顧客レコードが正しく表示されます。しかし、ステートメントのYesNOエイリアスは、o.OrderIDがnullの場合(つまり、未来の顧客がまだ注文していない場合)でも常に1を返します。どうして?私は以下のCASE文が正しいと思う(thisレスポンスも同様)。私はSQL Server 2012を使用しています。 :OrderIDはPKですが、結合条件が満たされていない場合は、OUTER JOINのorders表の他の列と一緒に常にNULLになります。T-SQL CASE句:外部ジョインでWHEN NULLを指定する際の問題

SELECT c.customerID, o.OrderID, CASE When o.OrderID is NULL Then 0 Else 1 End as YesNO 
FROM Customers c 
LEFT JOIN Orders o 
ON c.customerID = o.customerID 
+1

'o.OrderId'がnullの場合はありますか?あるいは、それは 'c.OrderId'であるはずですか? – DigiFriend

+0

@DigiFriendはい。そのため、私は 'o.OrderID'を' SELECT'に含めて検証することができます。 – nam

+0

あなたはnorthwindデータベースの下でそれを実行していますか?あなたの質問は正しいです。 'yes'なら0を正しく表示します – Fahmina

答えて

0

することは、あなたのELSEに評価しているので、なぜISNULL

は、私は、あなたが比較すると、結果はこのように偽、NULLでNULLにNULLであるため、理由があることをかなり確信して使用してみてください1

SELECT c.customerID, o.OrderID, CASE When ISNULL(o.OrderID, 0) = 0 Then 0 Else 
1 End as YesNO 
FROM Customers c 
LEFT JOIN Orders o 
ON c.customerID = o.customerID 
+0

問題の原因を説明してくれてありがとうございます。 – nam

+0

値が 'null 'であるかどうかをチェックすると、' null'ではなく、trueまたはfalseを返します。 '= null' *を使用して値がnullかどうかをチェックしようとすると、' null'が返されます。また、 'null'はfalseを意味するわけではありませんが、trueを意味するものではなく、' true'ではないので 'when ...'に '0'を返しません。 – SqlZim

関連する問題