sql شرح مزود خادم يعادل أوراكل NULLS الأولى؟




t-sql شرح (7)

لذلك لدى 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

أي آخرين؟


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

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


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

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

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

ORDER BY -CAST(date_sent as int) ASC

استخدم 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

مثال بسيط:

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

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

  • DESC + NULLS أولاً:

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

  • ASC + NULLS:

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

  • ASC + NULLS FIRST: إنه يعمل بشكل جيد بشكل افتراضي

  • DESC + NULLS LAST: إنه يعمل بشكل جيد بشكل افتراضي

دعنا نرى لماذا:

إذا قمت بفحص مستندات MSDN الخاصة بـ ORDER BY (SQL للعمليات) ، وانتقل إلى ASC | DESC ASC | DESC ، يمكنك قراءة هذا:

ASC | DESC

يحدد أنه يجب فرز القيم في العمود المحدد بترتيب تصاعدي أو تنازلي. يصنف ASC من أدنى قيمة إلى أعلى قيمة. فرز DESC من أعلى قيمة إلى أدنى قيمة. ASC هو ترتيب الفرز الافتراضي. يتم التعامل مع القيم الخالية باعتبارها أقل القيم الممكنة.

لذلك ، بشكل افتراضي إذا قمت بتحديد ترتيب ASC ، فإنه يعمل مثل NULLS FIRST . وإذا قمت بتحديد DESC ، فهو يعمل مثل NULLS LAST .

لذلك تحتاج فقط إلى تغيير سلوك NULLS FIRST بترتيب DESC ، و NULLS LAST بترتيب ASC .

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


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




tsql