Dalam SQL, ORDER BY
klausa biasanya digunakan untuk mengurutkan hasil kueri. Ini memungkinkan Anda memilih satu atau beberapa kolom untuk mengurutkan hasil, dan dalam banyak kasus, mungkin hanya itu yang Anda butuhkan.
Tetapi bagaimana jika Anda perlu membuat pengecualian?
Bagaimana jika Anda ingin hasilnya diurutkan berdasarkan abjad, kecuali satu baris? Atau beberapa baris?
Atau mungkin Anda hanya ingin meletakkan nilai NULL di akhir, saat memesan hasil non-NULL.
Either way, ada trik rapi yang dapat Anda gunakan yang memungkinkan Anda melakukan ini. Dan bagian baiknya adalah, ini sederhana.
Anda dapat memenuhi semua skenario di atas dengan menambahkan CASE
ekspresikan ke ORDER BY
. Anda klausa.
Contoh 1 – Pindahkan “Lainnya” ke Bawah
Misalkan kita menjalankan kueri berikut terhadap tabel yang berisi genre musik.
SELECT Genre
FROM MusicGenres
ORDER BY Genre ASC;
Hasil:
+---------+ | Genre | |---------| | Blues | | Country | | Hip Hop | | Jazz | | Metal | | Other | | Pop | | Rap | | Rock | +---------+
Dalam hal ini, kami mengurutkan hasil berdasarkan Genre
kolom, dalam urutan menaik.
Ini baik-baik saja kecuali untuk satu hal. Genre yang disebut Lainnya . Bukankah lebih baik jika kita bisa pindah Lainnya ke bawah?
Kita dapat mencapai ini dengan CASE
ekspresi. Oleh karena itu, kita dapat mengambil kueri di atas, dan memodifikasi ORDER BY
klausa sebagai berikut.
SELECT Genre
FROM MusicGenres
ORDER BY
CASE Genre
WHEN 'Other' THEN 1
ELSE 0
END
ASC, Genre ASC;
Hasil:
+---------+ | Genre | |---------| | Blues | | Country | | Hip Hop | | Jazz | | Metal | | Pop | | Rap | | Rock | | Other | +---------+
Contoh 2 – Pindahkan NULL ke Bawah
Jika tabel Anda kebetulan berisi salah satu dari nilai NULL yang mengganggu, Anda akan menemukan bahwa mereka akan bersikeras untuk tetap berada di atas saat Anda memesan dalam urutan menaik.
Sekali lagi, CASE
ekspresi untuk menyelamatkan!
Mari kita bayangkan bahwa tabel di atas berisi beberapa nilai NULL. Dan ketika kami menjalankan kueri kami, tampilannya lebih seperti ini:
SELECT Genre
FROM MusicGenres
ORDER BY
CASE Genre
WHEN 'Other' THEN 1
ELSE 0
END
ASC, Genre ASC;
Hasil:
+---------+ | Genre | |---------| | NULL | | NULL | | Blues | | Hip Hop | | Jazz | | Metal | | Pop | | Rock | | Other | +---------+
Jadi sekarang kami ingin memindahkan nilai NULL ke bawah – bahkan lebih rendah dari Lainnya .
Kita dapat melakukannya dengan kueri berikut.
SELECT Genre
FROM MusicGenres
ORDER BY
CASE
WHEN Genre IS NULL THEN 2
WHEN Genre = 'Other' THEN 1
ELSE 0
END
ASC, Genre ASC;
Hasil:
+---------+ | Genre | |---------| | Blues | | Hip Hop | | Jazz | | Metal | | Pop | | Rock | | Other | | NULL | | NULL | +---------+
Dalam contoh ini, kami menggunakan CASE
yang berbeda format. Dalam contoh ini kami menggunakan menelusuri CASE
ekspresi , berbeda dengan contoh sebelumnya yang menggunakan CASE
. sederhana ekspresi .
CASE
. yang dicari ekspresi mengevaluasi satu set ekspresi Boolean untuk menentukan hasilnya.
CASE
sederhana ekspresi, di sisi lain, membandingkan ekspresi dengan satu set ekspresi sederhana untuk menentukan hasilnya.
CASE
sederhana ekspresi memiliki ekspresi input di sebelah CASE
kata kunci, sedangkan CASE
yang dicari ekspresi tidak.
Contoh 3 – Perbaiki Baris Tertentu ke Atas
Sekarang bayangkan kita ingin memiliki satu atau lebih baris yang selalu berada di atas hasil, terlepas dari mana mereka cocok dalam urutan hasil yang lebih luas.
Misalnya:
SELECT * FROM vAlbums
ORDER BY ArtistName ASC, AlbumName ASC;
Hasil:
+------------------------+--------------------------+---------+ | 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 | +------------------------+--------------------------+---------+
Hasil ini diurutkan berdasarkan ArtistName
, lalu dengan AlbumName
.
Tetapi perusahaan rekaman telah memutuskan bahwa mereka ingin melakukan promosi khusus untuk Tom Jones . Jadi mereka menginginkan Tom Jones untuk muncul di bagian atas hasil, tetapi semua hasil yang tersisa harus diurutkan apa adanya – menurut abjad nama artis, lalu nama album.
Dalam hal ini, kita dapat melakukan hal berikut:
SELECT * FROM vAlbums
ORDER BY
CASE ArtistName
WHEN 'Tom Jones' THEN 0
ELSE 1
END,
ArtistName ASC, AlbumName ASC;
Hasil:
+------------------------+--------------------------+---------+ | 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 | +------------------------+--------------------------+---------+