最初に特定の値を持つ行を返すにはどうすればよいですか?


124

クエリで、最初に列に特定の値が含まれるテーブルの行を返し、次に残りの行をアルファベット順に返します。

この例のようなテーブルがある場合:

 - Table: Users
 - id - name -  city
 - 1    George  Seattle
 - 2    Sam     Miami
 - 3    John    New York
 - 4    Amy     New York
 - 5    Eric    Chicago
 - 6    Nick    New York

そして、そのテーブルを使用して、クエリに最初にNew Yorkを含む行を返し、次に残りの行を都市でアルファベット順に返します。これは1つのクエリのみを使用して実行できますか?


最初の回答はMySQLでのみ機能し、MSSQLでは機能しないため、可能であれば、受け入れられた回答を2番目の回答に変更することを検討してください。
Magisch 2017年

できました。私の最初の質問はMySQLに関するものでしたが、タグはとにかくそれを反映していませんでした。
Phoexo 2017年

ありがとうございました。私は今朝、私が抱えていた問題に対して同様のことをするために出会いました。:)
Magisch 2017年

回答:


195

SQL Server、Oracle、DB2、およびその他の多くのデータベースシステムでは、これを使用できます。

ORDER BY CASE WHEN city = 'New York' THEN 1 ELSE 2 END, city

1
ありがとう!MsSQLで私を助けた
Rexxo

これは実際にはどのSQLデータベースでも機能します(そして私の意見で受け入れられている回答よりもはるかにクリーンなソリューションです)
a_horse_with_no_name

2
オラクルで私のために働く。
MonkeyWithDarts 2013年

1
そして、最後の「ニューヨーク」(または他の値)私は場所に必要なもののために、単に都市= 'ニューヨークのTHEN 2 ELSE 1 END、市はWHEN 1及び2 ... ORDER BY CASEを入れ替える
deebs

4
このELSE 2セクションは、ニューヨークが値1を取得する一方で、他のすべての値は値2を取得することを意味します。少なくとも、ソート順に関しては。
Rob Farley 2017年

106

SQL方言がブール式を数値を持つものとして扱うのに十分インテリジェントである場合は、以下を使用できます。

SELECT *
FROM `Users`
ORDER BY (`city` = 'New York') DESC, `city`

1
@MehrdadAfshari:いいえ、MSSQLは愚かすぎて、ORDER BY句の同等性テストを処理できません。
2013

@a_horse_with_no_name:MSSQLに対して上記のクエリを実行してみましたか?
混沌

11
@chaos:上記のステートメントは実際にSQL Serverでは実行されませんが、これは構文が非標準であり、MySQLでのみ機能するためです。使用している場合CASE(標準SQLである)ステートメントをSQL Serverは非常によくで式を使用することができますORDER BY句。「同等性テストを処理するには愚かすぎる」は単に間違っています。もしそうなら、「MySQLによるブールtrue値の値1(1)への暗黙のキャストはサポートされていません。
a_horse_with_no_name

@ Esraa_92:それを処理できるSQL方言がなく、Rob Farleyの回答が必要です。
混乱

5
Postgresの場合、これは私にとってORDER BY id = 123 DESC, name ASC
うまくいき

4

私の答えは古くて必要ではないかもしれませんが、誰かが異なるアプローチを必要とするかもしれないので、ここに投稿してください。

私はこれを実装する同じ要件を持っていて、私のために働きました。

Select * from Users
ORDER BY
(CASE WHEN city = 'New York' THEN 0 ELSE 1 END), city
GO

PS

これはSQL用です

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.