سؤال

لدي tsql ضمن حدد ذلك يمكن إرجاع null.حاولت استخدام ISNULL ليحل محله مع 0 ولكن لسبب ما لا يعمل.الجدول اختيار من لديه الأعمدة التالية:

  • storeID --> int
  • penaltyPercent --> عشري(9,2)
  • penaltyDate --> التاريخ والوقت
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  
هل كانت مفيدة؟

المحلول

عندما تقول "عندما يكون التاريخ قبل أول عقوبة التاريخ" ، تعني عندما تكون قيمة @date أقل من القيمة التي تم إرجاعها من هذا الاستعلام?

SELECT MIN(penaltyDate)
FROM Penalty

لأن ثم الاستعلام الداخلي هو الذهاب الى العودة فارغة ، (في حالة استخدام ANSI بالقيم الفارغة) هذا الجزء سيعود كاذبة ،

WHERE (penaltyDate = ...

لأن المقارنات مع null دائما العودة فارغة.لذا بدلا من تحديد صف واحد مع قيمة فارغة, أنت اختيار أية صفوف.

إضافة:

لتأكيد هذه المشكلة تغيير إعدادات الاستعلام الخارجي أول خط

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

فإنه سيتم العمل بسبب ما وصفتها أعلاه.

نصائح أخرى

إذا @تاريخ < penaltyDate, ثم لا يوجد أي صف عاد, حتى لا يكون هناك أي قيمة ISNULL للعمل عليها.قد ترغب في تحديد العقوبة في المئة إلى متغير ثم حدد إلى مجموعة النتائج ISNULL(@pentaltyPercent).

هل في الحقيقة لدي بيانات التاريخ قبل أول penaly التاريخ ؟ إذا كان الاستعلام الخاص بك لا عودة السجلات الخاصة بك IsNull شرط سوف تفعل أي شيء لأنه يعمل ضد أي شيء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top