it-swarm.asia

بيان حالة خادم SQL عند IS NULL

أحاول القيام بوظيفة نوع جملة IF في خادم SQL.

عندما يكون هناك NULL في الحقل ، أريده أن يأخذ حقلًا من أحد الجداول ويضيف 10 أيام إليه.

وإذا كان ذلك ممكنا إنشاء عمود آخر وإضافة 30 يوما.

SELECT DISTINCT
    B.[ID],
    MAX(A.[START DATE]),
    B.[STAT],
    C.[POST DATE],
    CASE
          WHEN (C.[POST DATE] BETWEEN C.[EVENT DATE]+10 AND C.[EVENT DATE]+30) THEN 'GOOD'
          END AS [BETTER VISIT],
    CASE
          WHEN B.[STAT] IS NULL THEN (C.[EVENT DATE]+10)
          ELSE '-'
          END AS [DATE]
FROM 
    #TEMP1 A
    FULL OUTER JOIN #TEMP2 B
    ON A.[ID]=B.[ID]
    FULL OUTER JOIN #TEMP3 C
    ON A.[ID]=C.[ID]
GROUP BY
    B.[ID],
    B.[STAT],
    C.[POST DATE],
    C.[EVENT DATE]
ORDER BY
    A.[START DATE] DESC

سوف تبدو النتيجة مثل:

    ID  START DATE   STAT    POST DATE    BETTER VISIT    DATE         DATE2
    ---------------------------------------------------------------------------
    1   2013-01-01   GOOD    2013-11-01   GOOD            -            -
    2   2013-03-01   NULL    NULL         NULL            2013-03-11   2013-03-31
52
caffaddt
CASE WHEN B.[STAT] IS NULL THEN (C.[EVENT DATE]+10)   -- Type DATETIME
     ELSE '-'                                         -- Type VARCHAR
     END AS [DATE]

تحتاج إلى تحديد نوع واحد أو آخر للحقل ، ولا يمكن أن يختلف نوع الحقل حسب الصف. أبسط هو إزالة ELSE '-' والسماح لها ضمنيًا الحصول على القيمة NULL بدلاً من ذلك للحالة الثانية.

70
Joachim Isaksson

أتفق مع يواكيم على أنه يجب استبدال الواصلة بـ NULL. ولكن ، إذا كنت تريد فعلًا واصلة ، فقم بتحويل التاريخ إلى سلسلة:

(CASE WHEN B.[STAT] IS NULL
      THEN convert(varchar(10), C.[EVENT DATE]+10, 121)
      ELSE '-'
 END) AS [DATE]

أيضًا ، distinct غير ضرورية في بيان select. ال group by هل هذا بالفعل بالنسبة لك.

13
Gordon Linoff

يمكنك استخدام IIF (أعتقد من SQL Server 2012)

SELECT IIF(B.[STAT] IS NULL, C.[EVENT DATE]+10, '-') AS [DATE]
5
Xin
  case isnull(B.[stat],0)
  when 0 then dateadd(dd,10,(c.[Eventdate]))
  end

يمكنك إضافة عبارة أخرى إذا كنت ترغب في إضافة 30 يومًا إلى ذلك.

4
Mahesh Sambu

في هذه الحالة ، يمكنك استخدام دالة ISNULL () بدلاً من تعبير CASE

ISNULL(B.[STAT], C.[EVENT DATE]+10) AS [DATE]
3
Abdullah Zaid

لا يتم قبول الواصلة في بيان ELSE الخاص بك في العمود الذي يتم تعريفه تحت نوع بيانات التاريخ. يمكنك إما:

أ) لف CAST حول الحقل [stat] لتحويله إلى تمثيل varchar للتاريخ

ب) استخدم وقتًا مثل 9999-12-31 لقيمة ELSE الخاصة بك.

1
user2620038

ألقِ نظرة على وظيفة ISNULL. يساعدك استبدال القيم NULL لقيم أخرى. http://msdn.Microsoft.com/en-us/library/ms184325.aspx

0
Kees de Wit