Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Cách viết mệnh đề ORDER BY có ngoại lệ bằng SQL

Trong SQL, ORDER BY mệnh đề thường được sử dụng để sắp xếp các kết quả của một truy vấn. Nó cho phép bạn chọn một hoặc nhiều cột để sắp xếp kết quả và trong hầu hết các trường hợp, đó có thể là tất cả những gì bạn cần.

Nhưng nếu bạn cần tạo một ngoại lệ thì sao?

Điều gì xảy ra nếu bạn muốn kết quả được sắp xếp theo thứ tự bảng chữ cái, ngoại trừ một hàng? Hay nhiều hàng?

Hoặc có lẽ bạn chỉ muốn đặt bất kỳ giá trị NULL nào vào cuối, trong khi sắp xếp các kết quả không phải NULL.

Dù bằng cách nào, có một mẹo nhỏ mà bạn có thể sử dụng sẽ cho phép bạn thực hiện điều này. Và phần tốt là, nó rất đơn giản.

Bạn có thể đáp ứng cho tất cả các trường hợp trên bằng cách thêm CASE biểu thức cho ORDER BY của bạn mệnh đề.

Ví dụ 1 - Di chuyển "Khác" xuống dưới cùng

Giả sử chúng ta chạy truy vấn sau đối với một bảng chứa các thể loại nhạc.

SELECT Genre 
FROM MusicGenres
ORDER BY Genre ASC;

Kết quả:

+---------+
| Genre   |
|---------|
| Blues   |
| Country |
| Hip Hop |
| Jazz    |
| Metal   |
| Other   |
| Pop     |
| Rap     |
| Rock    |
+---------+

Trong trường hợp này, chúng tôi sắp xếp các kết quả theo Genre cột, theo thứ tự tăng dần.

Điều này là tốt, ngoại trừ một điều. Thể loại có tên Khác . Sẽ không tốt nếu chúng ta có thể di chuyển Khác xuống dưới cùng?

Chúng ta có thể đạt được điều này với CASE biểu hiện. Do đó, chúng tôi có thể thực hiện truy vấn trên và sửa đổi ORDER BY của nó mệnh đề như sau.

SELECT Genre
FROM MusicGenres
ORDER BY 
    CASE Genre
        WHEN 'Other' THEN 1
        ELSE 0
    END
    ASC, Genre ASC;

Kết quả:

+---------+
| Genre   |
|---------|
| Blues   |
| Country |
| Hip Hop |
| Jazz    |
| Metal   |
| Pop     |
| Rap     |
| Rock    |
| Other   |
+---------+

Ví dụ 2 - Di chuyển NULL xuống dưới cùng

Nếu bảng của bạn tình cờ chứa bất kỳ giá trị NULL nào trong số đó gây khó chịu, bạn sẽ thấy rằng chúng sẽ khăng khăng ở vị trí đầu khi bạn sắp xếp theo thứ tự tăng dần.

Một lần nữa, CASE biểu hiện để giải cứu!

Hãy tưởng tượng rằng bảng trên chứa một vài giá trị NULL. Và khi chúng tôi chạy truy vấn của mình, nó trông giống như sau:

SELECT Genre
FROM MusicGenres
ORDER BY 
    CASE Genre
        WHEN 'Other' THEN 1
        ELSE 0
    END
    ASC, Genre ASC;

Kết quả:

+---------+
| Genre   |
|---------|
| NULL    |
| NULL    |
| Blues   |
| Hip Hop |
| Jazz    |
| Metal   |
| Pop     |
| Rock    |
| Other   |
+---------+

Vì vậy, bây giờ chúng tôi muốn di chuyển các giá trị NULL xuống dưới cùng - thậm chí thấp hơn Khác .

Chúng tôi có thể làm điều đó với truy vấn sau.

SELECT Genre
FROM MusicGenres
ORDER BY 
    CASE
        WHEN Genre IS NULL THEN 2
        WHEN Genre = 'Other' THEN 1
        ELSE 0
    END
    ASC, Genre ASC;

Kết quả:

+---------+
| Genre   |
|---------|
| Blues   |
| Hip Hop |
| Jazz    |
| Metal   |
| Pop     |
| Rock    |
| Other   |
| NULL    |
| NULL    |
+---------+

Trong ví dụ này, chúng tôi đã sử dụng một CASE khác định dạng. Trong ví dụ này, chúng tôi đã sử dụng CASE được tìm kiếm biểu thức , trái ngược với ví dụ trước đó, sử dụng một CASE đơn giản biểu thức .

CASE đã tìm kiếm biểu thức đánh giá một tập hợp các biểu thức Boolean để xác định kết quả.

CASE đơn giản mặt khác, biểu thức so sánh một biểu thức với một tập hợp các biểu thức đơn giản để xác định kết quả.

CASE đơn giản biểu thức có một biểu thức đầu vào bên cạnh CASE từ khóa, trong khi CASE được tìm kiếm thì không.

Ví dụ 3 - Cố định một số hàng lên đầu

Bây giờ, hãy tưởng tượng chúng ta muốn có một hoặc nhiều hàng luôn ở trên cùng của kết quả, bất kể chúng nằm ở đâu trong thứ tự của các kết quả rộng hơn.

Ví dụ:

SELECT * FROM vAlbums
ORDER BY ArtistName ASC, AlbumName ASC;

Kết quả:

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

Các kết quả này được sắp xếp theo thứ tự của ArtistName , rồi đến AlbumName .

Nhưng công ty thu âm đã quyết định rằng họ muốn thực hiện một chương trình khuyến mãi đặc biệt cho Tom Jones . Và vì vậy họ muốn Tom Jones xuất hiện ở đầu kết quả, nhưng sau đó tất cả các kết quả còn lại phải được sắp xếp như cũ - theo thứ tự bảng chữ cái theo tên nghệ sĩ, sau đó theo tên album.

Trong trường hợp này, chúng ta có thể làm như sau:

SELECT * FROM vAlbums
ORDER BY 
    CASE ArtistName
        WHEN 'Tom Jones' THEN 0
        ELSE 1
    END,
    ArtistName ASC, AlbumName ASC;

Kết quả:

+------------------------+--------------------------+---------+
| 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. 9 phương pháp hay nhất để viết truy vấn SQL

  2. Làm thế nào để chuyển đổi một chuỗi thành chữ thường trong SQL

  3. Toán tử SQL không bằng với () cho người mới bắt đầu

  4. Salesforce SOQL từ Microsoft Office

  5. Giảm thiểu rủi ro dữ liệu thông qua Mặt nạ dữ liệu