2009-03-24 6 views
0

nullを返すTSQL SELECTがあります。私はISNULLを使って0に置き換えようとしましたが、何らかの理由で動作しませんでした。選択テーブルには、次のカラムがありますISNULLがTSQL Selectで動作しません。

  • storeID - > INT
  • penaltyPercent - >小数(9,2)
  • penaltyDate - >のdateTime
SELECT ISNULL(penaltyPercent, 0.0) AS penaltyPercent 
FROM dbo.Penalty 
WHERE (penaltyDate = (SELECT  MAX(penaltyDate) AS date 
         FROM  dbo.Penalty AS Penalty_1 
         WHERE  (penaltyDate <= @date) AND (storeID = @storeID))) AND 
     (storeID = @storeID) 

日付が最初のペナルティ日付の前にあるとき(ペナルティが0になるべきとき)、結果は返されません。なぜこれが機能しないのか分かりません。私は回避策がありますが、それは私を悩ませています。ここで

が使用されているデータのサンプルです:

storeID penaltyDate    penaltyPercent 
182  10/1/2008 12:00:00 AM 0.020000 
182  11/1/2008 12:00:00 AM 0.040000 
182  12/1/2008 12:00:00 AM 0.070000 
+0

あなたの答えは、それは明らかにその方法です – eKek0

+0

ありがとう、誰も、相対的なSQLのnoobから。 – monkeypushbutton

答えて

4

あなたは「日が最初のペナルティ日前である場合には、」@dateの値が返された値未満の場合、あなたが意味するかと言うときこのクエリから?

SELECT MIN(penaltyDate) 
FROM Penalty 

(あなたはANSIのNULL値を使用している場合)、あなたの内側のクエリがnullとの比較は常にnullを返すので、この部分は、

WHERE (penaltyDate = ... 

をfalseを返しますnullを返しに行く、とされているので。したがって、ヌル値を持つ1つのローを選択する代わりに、ローを選択しません。

補遺:

これを確認するには、それが原因で私が上記した内容で動作します

SELECT ISNULL(MAX(penaltyPercent),0.0) AS penaltyPercent 

にあなたの外側のクエリの最初の行を変更し、問題となっています。

+0

内部クエリはnullを返しません。空の結果セットを返します。 –

+0

@P Daddy:SQL Server 2000でテストしました。驚いたことに、この状況では実際にはnullを返します。私は内部クエリがレコードを返さないことを期待しましたが、nullを返します。ただし、外部クエリはレコードを返しません。 – Welbog

+0

私は訂正しました。 –

2

@date < penaltyDateの場合、返される行はないため、ISNULLが処理される値はありません。変数にペナルティ・パーセントを選択し、結果セットISNULL(@pentaltyPercent)を選択することができます。

0

最初のペナリデートの日付よりも前の日付であることが重要ですか?クエリでレコードが返されない場合は、IsNull句は何にでも作用するため何らかの処理を行います。

関連する問題