Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Cara Menulis Klausa ORDER BY dengan Pengecualian menggunakan SQL

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     |
+------------------------+--------------------------+---------+


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menghubungkan SAS JMP ke Salesforce.com

  2. Memahami Pengumpulan Tingkat Basis Data dan Dampak Mengubahnya untuk Basis Data

  3. SQL PILIH MIN

  4. Pernyataan SQL DROP TABLE dan Berbagai Kasus Penggunaan

  5. Pelajari Dasar-dasar Pencatatan Java