تحقق من وجود تاريخ لاغية في بيان حالة، حيث يكون الخطأ الأول ذهب؟

StackOverflow https://stackoverflow.com/questions/2453974

سؤال

ومحدثي جدول يشبه هذا

Id     StartDate
1      (null)
2      12/12/2009
3      10/10/2009

وأريد أن إنشاء العبارة حدد، أن يختار ما سبق، ولكن لديه أيضا عمود إضافي لعرض VARCHAR إذا كان التاريخ غير فارغة مثل:

Id     StartDate    StartDateStatus
1      (null)       Awaiting
2      12/12/2009   Approved
3      10/10/2009   Approved

ولقد التالية في بلدي اختيار، ولكن لا يبدو أن العمل. يتم تعيين كل من الحالات إلى Approved على الرغم من أن مواعيد لها بعض القيم الخالية

        select
             id,
             StartDate,
        CASE StartDate
        WHEN null THEN 'Awaiting'
        ELSE 'Approved' END AS StartDateStatus
        FROM myTable

ونتائج نظرتي الاستعلام مثل:

Id     StartDate    StartDateStatus
1      (null)       Approved
2      12/12/2009   Approved
3      10/10/2009   Approved
4      (null)       Approved
5      (null)       Approved

وتاريخ البدء هو smalldatetime، وهناك بعض استثناء لكيفية التعامل مع هذا؟

والشكر

هل كانت مفيدة؟

المحلول

وجرب:

select
     id,
     StartDate,
CASE WHEN StartDate IS NULL
    THEN 'Awaiting'
    ELSE 'Approved' END AS StartDateStatus
FROM myTable

وأنت رمز قد تم القيام عند تاريخ البدء = NULL، على ما أعتقد.


وNULL أبدا يساوي NULL (كما NULL هو عدم وجود قيمة). NULL هو أيضا لم يكن يساوي NULL. لاحظ بناء الجملة أعلاه هو ANSI SQL القياسية وان العكس يكون StartDate IS NOT NULL.

ويمكنك تشغيل ما يلي:

SELECT CASE WHEN (NULL = NULL) THEN 1 ELSE 0 END AS EqualityCheck,
CASE WHEN (NULL <> NULL) THEN 1 ELSE 0 END AS InEqualityCheck,
CASE WHEN (NULL IS NULL) THEN 1 ELSE 0 END AS NullComparison

وهذا من العوائد:

EqualityCheck = 0
InEqualityCheck = 0
NullComparison = 1

لاكتمال، في SQL Server يمكنك:

SET ANSI_NULLS OFF;

والتي من شأنها أن تؤدي إلى متساوين مقارنات الخاص بك يعمل بشكل مختلف:

SET ANSI_NULLS OFF

SELECT CASE WHEN (NULL = NULL) THEN 1 ELSE 0 END AS EqualityCheck,
CASE WHEN (NULL <> NULL) THEN 1 ELSE 0 END AS InEqualityCheck,
CASE WHEN (NULL IS NULL) THEN 1 ELSE 0 END AS NullComparison

والتي ترجع:

EqualityCheck = 1
InEqualityCheck = 0
NullComparison = 1

ولكن سأكون في غاية يوصي ضد القيام بذلك. الناس الحفاظ فيما بعد التعليمة البرمجية الخاصة بك قد تكون مضطرة لاصطياد أنت إلى أسفل ويصب عليك ...

وأيضا، فإنه لم يعد العمل في الإصدارات القادمة لخادم SQL:

https://msdn.microsoft.com/en-GB/library/ ms188048.aspx

نصائح أخرى

select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
  'Awaiting'
Else
  'Approved'
END AS StartDateStatus
From MyTable
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top