queries - t-sql شرح




مزود خادم يعادل أوراكل NULLS الأولى؟ (6)

لذلك لدى Oracle NULLS FIRST ، والتي يمكنني استخدامها لترتيب القيم الخالية في الأعلى متبوعة بقيمة العمود في الترتيب التنازلي:

ORDER BY date_sent NULLS FIRST

ما هو قابل للمقارنة في SQL Server؟ هناك هذه البدائل ، بافتراض أن قيم التاريخ هي NULL أو في الماضي:

ORDER BY ISNULL(date_sent, GETDATE()) DESC
ORDER BY (CASE WHEN t.setinactive IS NULL THEN 1 ELSE 2 END), t.setinactive DESC
ORDER BY -CAST(date_sent as int) ASC

أي آخرين؟


إذا كان لديك صفوف في الجدول مع تواريخ أقل من الآن ، وصفوف أخرى ذات تواريخ أكبر من الآن ، فقد تظهر NULLS في منتصف القائمة. بدلاً من ذلك ، ربما يجب عليك استخدام قيمة لن يتم فرزها في منتصف قائمتك.

ترتيب حسب IsNull (Date_Sent ، '17530101') تنازلي

ملاحظة: هذا التاريخ هو في الواقع في 1 يناير 1753.


استخدم Case / When statement ، على سبيل المثال:

ORDER BY (case WHEN ColINT IS NULL THEN {maxIntValue} ELSE ColINT END) DESC

ORDER BY (case WHEN ColVChar IS NULL THEN {maxVCharValue} ELSE ColVChar END) DESC

ORDER BY (case WHEN ColDateT IS NULL THEN {maxDateTValue} ELSE ColDateT END) DESC

...وما إلى ذلك وهلم جرا.

أو حتى أفضل لأنك لا تهتم ما هو نوع العمود الخاص بك والقيمة القصوى.

ORDER BY (case WHEN ColAnyType IS NULL THEN 1 ELSE 0 END) DESC, ColAnyType DESC

لا يمكنك التحكم في هذا ، على حد علمي. ويبدو أن لديك النهج الصحيح مع ISNULL .

باستخدام السلاسل ، استخدمت ISNULL(field, '') لنفس الغرض.


مثال بسيط:

SELECT (CASE WHEN Value1 IS NULL THEN 1 ELSE 0 END) AS ValueIsNull, Value1, Value2, Value3
FROM TableName
ORDER BY ValueIsNull DESC, Value1 

يمكنك القيام ببعض الحيله:

ORDER BY (CASE WHEN [Order] IS NULL THEN 0 ELSE 1 END), [Order] 

ORDER BY
  COALESCE(POSTING_DATE,'1900-01-01 00:00:00.000')
 ,OTHER_FIELDS






tsql