SQLでは、ORDER BY
句は通常、クエリの結果を並べ替えるために使用されます。 1つ以上の列を選択して結果を並べ替えることができ、ほとんどの場合、必要なのはそれだけです。
しかし、例外を設ける必要がある場合はどうなりますか?
結果を1行を除いてアルファベット順に並べたい場合はどうなりますか?または複数の行?
または、NULL以外の結果を並べ替えるときに、NULL値を最後に配置したい場合もあります。
いずれにせよ、これを可能にする巧妙なトリックがあります。そして良い点は、それがシンプルなことです。
CASE
を追加することで、上記のすべてのシナリオに対応できます。 ORDER BY
への表現 条項。
例1-「その他」を一番下に移動
音楽のジャンルを含むテーブルに対して次のクエリを実行するとします。
SELECT Genre
FROM MusicGenres
ORDER BY Genre ASC;
結果:
+---------+ | Genre | |---------| | Blues | | Country | | Hip Hop | | Jazz | | Metal | | Other | | Pop | | Rap | | Rock | +---------+
この場合、結果はGenre
で並べ替えられます。 列、昇順。
これは1つを除いて問題ありません。 その他というジャンル 。 その他を移動できたら素晴らしいと思いませんか 一番下まで?
これは、CASE
で実現できます。 表現。したがって、上記のクエリを取得して、そのORDER BY
を変更できます。 次のような条項。
SELECT Genre
FROM MusicGenres
ORDER BY
CASE Genre
WHEN 'Other' THEN 1
ELSE 0
END
ASC, Genre ASC;
結果:
+---------+ | Genre | |---------| | Blues | | Country | | Hip Hop | | Jazz | | Metal | | Pop | | Rap | | Rock | | Other | +---------+
例2–NULLを一番下に移動する
テーブルに厄介なNULL値が含まれている場合は、昇順で注文するときに、それらが一番上に留まることを主張することがわかります。
もう一度、CASE
救助への表現!
上記の表にいくつかのNULL値が含まれていると想像してみましょう。クエリを実行すると、次のようになります。
SELECT Genre
FROM MusicGenres
ORDER BY
CASE Genre
WHEN 'Other' THEN 1
ELSE 0
END
ASC, Genre ASC;
結果:
+---------+ | Genre | |---------| | NULL | | NULL | | Blues | | Hip Hop | | Jazz | | Metal | | Pop | | Rock | | Other | +---------+
そこで、NULL値を一番下に移動します–その他よりもさらに低くします 。
次のクエリでそれを行うことができます。
SELECT Genre
FROM MusicGenres
ORDER BY
CASE
WHEN Genre IS NULL THEN 2
WHEN Genre = 'Other' THEN 1
ELSE 0
END
ASC, Genre ASC;
結果:
+---------+ | Genre | |---------| | Blues | | Hip Hop | | Jazz | | Metal | | Pop | | Rock | | Other | | NULL | | NULL | +---------+
この例では、別のCASE
を使用しました フォーマット。この例では、検索されたCASE
を使用しました 表現 、単純なCASE
を使用した前の例とは対照的に 表現 。
検索されたCASE
expressionは、ブール式のセットを評価して結果を決定します。
シンプルなCASE
一方、式は、式を一連の単純な式と比較して結果を決定します。
シンプルなCASE
式には、CASE
の横に入力式があります 一方、検索されたCASE
表現はしません。
例3–特定の行を一番上に修正
ここで、より広い結果の順序のどこに収まるかに関係なく、常に結果の一番上にある1つ以上の行が必要だと想像してください。
例:
SELECT * FROM vAlbums
ORDER BY ArtistName ASC, AlbumName ASC;
結果:
+------------------------+--------------------------+---------+ | ArtistName | AlbumName | Genre | |------------------------+--------------------------+---------| | AC/DC | Powerage | Rock | | Allan Holdsworth | All Night Wrong | Jazz | | Allan Holdsworth | The Sixteen Men of Tain | Jazz | | Buddy Rich | Big Swing Face | Jazz | | Devin Townsend | Casualties of Cool | Rock | | Devin Townsend | Epicloud | Rock | | Devin Townsend | Ziltoid the Omniscient | Rock | | Iron Maiden | Killers | Rock | | Iron Maiden | No Prayer for the Dying | Rock | | Iron Maiden | Piece of Mind | Rock | | Iron Maiden | Powerslave | Rock | | Iron Maiden | Somewhere in Time | Rock | | Jim Reeves | Singing Down the Lane | Country | | Michael Learns to Rock | Blue Night | Pop | | Michael Learns to Rock | Eternity | Pop | | Michael Learns to Rock | Scandinavia | Pop | | The Script | No Sound Without Silence | Pop | | Tom Jones | Along Came Jones | Pop | | Tom Jones | Long Lost Suitcase | Pop | | Tom Jones | Praise and Blame | Pop | +------------------------+--------------------------+---------+
これらの結果は、ArtistName
の順に並べられています。 、次にAlbumName
。
しかし、レコード会社は、トムジョーンズの特別プロモーションを行いたいと判断しました。 。そして彼らはトムジョーンズを望んでいます 結果の上部に表示されますが、残りのすべての結果は、アーティスト名、アルバム名の順にアルファベット順に並べられます。
この場合、次のことができます。
SELECT * FROM vAlbums
ORDER BY
CASE ArtistName
WHEN 'Tom Jones' THEN 0
ELSE 1
END,
ArtistName ASC, AlbumName ASC;
結果:
+------------------------+--------------------------+---------+ | ArtistName | AlbumName | Genre | |------------------------+--------------------------+---------| | Tom Jones | Along Came Jones | Pop | | Tom Jones | Long Lost Suitcase | Pop | | Tom Jones | Praise and Blame | Pop | | AC/DC | Powerage | Rock | | Allan Holdsworth | All Night Wrong | Jazz | | Allan Holdsworth | The Sixteen Men of Tain | Jazz | | Buddy Rich | Big Swing Face | Jazz | | Devin Townsend | Casualties of Cool | Rock | | Devin Townsend | Epicloud | Rock | | Devin Townsend | Ziltoid the Omniscient | Rock | | Iron Maiden | Killers | Rock | | Iron Maiden | No Prayer for the Dying | Rock | | Iron Maiden | Piece of Mind | Rock | | Iron Maiden | Powerslave | Rock | | Iron Maiden | Somewhere in Time | Rock | | Jim Reeves | Singing Down the Lane | Country | | Michael Learns to Rock | Blue Night | Pop | | Michael Learns to Rock | Eternity | Pop | | Michael Learns to Rock | Scandinavia | Pop | | The Script | No Sound Without Silence | Pop | +------------------------+--------------------------+---------+