ISNULL لا يعمل في tsql ضمن حدد
سؤال
لدي 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 شرط سوف تفعل أي شيء لأنه يعمل ضد أي شيء.