7

「優先順位」と呼ばれる (int) 列があります。アイテムを選択するとき、優先度が最も高い (数字が最も小さい) アイテムを最初に、優先度が最も低い (数字が最も大きい) アイテムを最後にします。

ただし、優先度のない項目 (現在は優先度 0) は、優先度のある項目の後に別の列にリストする必要があります。

言い換えると。これらの優先順位がある場合:

 1 2 0 0 5 0 8 9

次のように並べ替えるにはどうすればよいですか。

 1 2 5 8 9 0 0 0 

0 の代わりに Int.max を使用できると思いますが、0 は非常に優れたデフォルト値であり、維持しようとします。

4

5 に答える 5

22

私はそれがこれよりきれいになることができるとは思わない:

ORDER BY priority=0, priority

SQLFiddleデモ

他のソリューションとは異なり、このソリューションはインデックスオンを利用しpriority、レコード数が多い場合は高速になることに注意してください。

于 2013-02-23T06:28:29.970 に答える
7

試す:

order by case priority when 0 then 2 else 1 end, priority
于 2013-02-22T11:38:04.480 に答える
2

非常に簡単な解決策は、次のように並べ替えに複合値/「プレフィックス」を使用することです。

SELECT ...
FROM ...
ORDER By CASE WHEN priority = 0 THEN 9999 ELSE 0 END + priority, secondSortCriteriaCol
于 2013-02-22T11:38:18.707 に答える
1

これでうまくいきます。testtableをテーブル名に置き換える必要があります。

SELECT t.priority
FROM dbo.testtable t
ORDER BY (CASE WHEN t.priority = 0 THEN 2147483647 ELSE t.priority END)

明確でない場合は、2147483647を選択しました。これは、優先順位列の最大値であり、最後になるためです。

マークの答えはより良いものであり、それに合うものです。

于 2013-02-22T11:38:51.893 に答える
0

order by case(priority) when 0 then 10 else priority end

于 2013-02-22T12:03:45.100 に答える