Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pernyataan KASUS SQL

Dalam SQL, CASE pernyataan mengevaluasi daftar kondisi dan mengembalikan salah satu dari beberapa ekspresi hasil yang mungkin.

Dalam beberapa hal, SQL CASE pernyataan ini agak mirip dengan IF...ELSE pernyataan yang memungkinkan kita untuk memeriksa kondisi yang diberikan dan mengembalikan hasil yang berbeda tergantung pada hasilnya.

Apakah itu CASE Pernyataan atau CASE Ekspresi?

Dalam SQL, terkadang sesuatu disebut sebagai "pernyataan" padahal sebenarnya, itu adalah sesuatu yang lain. SQL “CASE pernyataan” adalah contohnya (maaf tentang permainan kata-kata!).

CASE Pernyataan ini dirujuk dalam standar SQL (ISO/IEC 9075) sebagai CASE ekspresi . Tujuannya adalah untuk “menentukan nilai bersyarat”.

Namun, beberapa DBMS membedakan antara CASE pernyataan dan CASE ekspresi, dan memiliki sintaks yang sedikit berbeda untuk masing-masing. Misalnya, MySQL dan MariaDB menyediakan CASE pernyataan dan CASE operator sebagai dua fitur berbeda, masing-masing dengan sintaks yang sedikit berbeda.

CASE Format

Dalam SQL, ada dua format CASE ekspresi:

  • CASE sederhana ekspresi
  • Menelusuri CASE ekspresi

Berikut adalah contoh masing-masing.

CASE Sederhana Ekspresi

CASE sederhana ekspresi membandingkan ekspresi dengan sekumpulan ekspresi sederhana untuk menentukan hasilnya.

Contoh:

DECLARE @animal VARCHAR(40);
SET @animal = 'Cow';

SELECT  
    CASE @animal  
        WHEN 'Bird' THEN 'Seed'
        WHEN 'Dog' THEN 'Beef'
        WHEN 'Cow' THEN 'Grass'
        ELSE 'Leftovers'  
    END;

Hasil:

Grass

Contoh ini dilakukan di MySQL, tetapi sebenarnya CASE ekspresi harus bekerja di sebagian besar RDBMS utama.

Dalam contoh ini, CASE my saya ekspresi adalah bagian dari SELECT penyataan. Ini memeriksa tiga kondisi dan memiliki ELSE untuk memenuhi apa pun yang tidak tercakup dalam tiga kondisi.

Dalam hal ini, hewan Cow cocok dengan WHEN third ketiga ekspresi, dan ekspresi yang diberikan oleh THEN dikembalikan.

Untuk lebih jelasnya, CASE yang sebenarnya ekspresi adalah bagian ini:

    CASE @animal  
        WHEN 'Bird' THEN 'Seed'
        WHEN 'Dog' THEN 'Beef'
        WHEN 'Cow' THEN 'Grass'
        ELSE 'Leftovers'  
    END

Apa CASE lakukan adalah memeriksa nilai setiap WHEN ekspresi terhadap ekspresi input. Dalam contoh ini, @animal variabel adalah ekspresi input. Oleh karena itu, ia memeriksa nilai setiap WHEN ekspresi terhadap @animal variabel.

Ketika/jika menemukan kecocokan, ia mengembalikan ekspresi yang disediakan oleh THEN . yang sesuai .

Contoh saya menggunakan tiga WHEN ekspresi, tetapi saya bisa menggunakan lebih banyak dan saya bisa menggunakan lebih sedikit, tergantung pada persyaratannya.

CASE yang Dicari Ekspresi

CASE . yang dicari ekspresi mengevaluasi satu set ekspresi Boolean untuk menentukan hasilnya.

Berikut adalah contoh CASE yang dicari ekspresi.

DECLARE @score int;
SET @score = 7;

SELECT
    CASE   
        WHEN @score > 8 THEN 'Congratulations!'
        WHEN @score > 5 AND @score < 8 THEN 'Well done!'
        ELSE 'Try harder next time'  
    END;

Hasil:

Well done!

CASE . yang dicari ekspresi tidak memiliki ekspresi input seperti CASE sederhana ekspresi.

Anda akan mengingatnya dalam CASE sederhana kami ekspresi, itu dimulai dengan CASE @animal , dan karena itu kami tahu bahwa WHEN ekspresi semuanya mengevaluasi terhadap nilai @animal .

Dengan pencarian CASE ekspresi, kami tidak memberikan ekspresi input di awal seperti itu. Sebagai gantinya, setiap WHEN ekspresi menyertakan ekspresi Boolean yang akan dievaluasi.

Contoh Basis Data

Berikut adalah contoh yang menunjukkan bagaimana CASE ekspresi dapat digunakan dalam kueri basis data.

USE World;
SELECT
    Name,
    Population,
      CASE 
         WHEN Population > 2000000 THEN 'Huge City'  
         WHEN Population >= 1000000 AND Population < 2000000 THEN 'Big City' 
         ELSE 'Small City'
      END AS Size
FROM City
WHERE CountryCode = 'USA'
ORDER BY Population DESC
LIMIT 20;

Hasil:

+---------------+------------+------------+
| Name          | Population | Size       |
+---------------+------------+------------+
| New York      |    8008278 | Huge City  |
| Los Angeles   |    3694820 | Huge City  |
| Chicago       |    2896016 | Huge City  |
| Houston       |    1953631 | Big City   |
| Philadelphia  |    1517550 | Big City   |
| Phoenix       |    1321045 | Big City   |
| San Diego     |    1223400 | Big City   |
| Dallas        |    1188580 | Big City   |
| San Antonio   |    1144646 | Big City   |
| Detroit       |     951270 | Small City |
| San Jose      |     894943 | Small City |
| Indianapolis  |     791926 | Small City |
| San Francisco |     776733 | Small City |
| Jacksonville  |     735167 | Small City |
| Columbus      |     711470 | Small City |
| Austin        |     656562 | Small City |
| Baltimore     |     651154 | Small City |
| Memphis       |     650100 | Small City |
| Milwaukee     |     596974 | Small City |
| Boston        |     589141 | Small City |
+---------------+------------+------------+

Contoh ini menggunakan pencarian CASE ekspresi untuk mengevaluasi hasil dari Population kolom City meja.

ELSE adalah Opsional

ELSE argumen adalah opsional. Jika kita menghilangkan ELSE , dan tidak ada kondisi yang dipicu, hasilnya adalah NULL .

Inilah yang terjadi jika kita menghilangkan ELSE klausa dari contoh sebelumnya:

USE World;
SELECT
    Name,
    Population,
      CASE 
         WHEN Population > 2000000 THEN 'Huge City'  
         WHEN Population >= 1000000 AND Population < 2000000 THEN 'Big City'
      END AS Size
FROM City
WHERE CountryCode = 'USA'
ORDER BY Population DESC
LIMIT 20;

Hasil:

+---------------+------------+-----------+
| Name          | Population | Size      |
+---------------+------------+-----------+
| New York      |    8008278 | Huge City |
| Los Angeles   |    3694820 | Huge City |
| Chicago       |    2896016 | Huge City |
| Houston       |    1953631 | Big City  |
| Philadelphia  |    1517550 | Big City  |
| Phoenix       |    1321045 | Big City  |
| San Diego     |    1223400 | Big City  |
| Dallas        |    1188580 | Big City  |
| San Antonio   |    1144646 | Big City  |
| Detroit       |     951270 | NULL      |
| San Jose      |     894943 | NULL      |
| Indianapolis  |     791926 | NULL      |
| San Francisco |     776733 | NULL      |
| Jacksonville  |     735167 | NULL      |
| Columbus      |     711470 | NULL      |
| Austin        |     656562 | NULL      |
| Baltimore     |     651154 | NULL      |
| Memphis       |     650100 | NULL      |
| Milwaukee     |     596974 | NULL      |
| Boston        |     589141 | NULL      |
+---------------+------------+-----------+

CASE dalam UPDATE Pernyataan

Mari tambahkan kolom ke City tabel dari contoh sebelumnya:

ALTER TABLE City
ADD COLUMN Size VARCHAR(30) AFTER Population;

SELECT * FROM City
LIMIT 10;

Begini tampilannya sekarang:

+----+----------------+-------------+---------------+------------+------+
| ID | Name           | CountryCode | District      | Population | Size |
+----+----------------+-------------+---------------+------------+------+
|  1 | Kabul          | AFG         | Kabol         |    1780000 | NULL |
|  2 | Qandahar       | AFG         | Qandahar      |     237500 | NULL |
|  3 | Herat          | AFG         | Herat         |     186800 | NULL |
|  4 | Mazar-e-Sharif | AFG         | Balkh         |     127800 | NULL |
|  5 | Amsterdam      | NLD         | Noord-Holland |     731200 | NULL |
|  6 | Rotterdam      | NLD         | Zuid-Holland  |     593321 | NULL |
|  7 | Haag           | NLD         | Zuid-Holland  |     440900 | NULL |
|  8 | Utrecht        | NLD         | Utrecht       |     234323 | NULL |
|  9 | Eindhoven      | NLD         | Noord-Brabant |     201843 | NULL |
| 10 | Tilburg        | NLD         | Noord-Brabant |     193238 | NULL |
+----+----------------+-------------+---------------+------------+------+

Kami belum memasukkan data apa pun ke dalam Size yang baru kolom, sehingga mengembalikan NULL di setiap baris.

Sekarang kita dapat menggunakan CASE ekspresi untuk memperbarui Size kolom dengan nilai yang bergantung pada nilai di Population kolom:

UPDATE City 
SET Size = 
    CASE 
        WHEN Population > 2000000 THEN 'Huge City'  
        WHEN Population >= 1000000 AND Population < 2000000 THEN 'Big City'
        ELSE 'Small City'
    END;

Sekarang mari kita pilih data dari tabel:

SELECT * FROM City
WHERE CountryCode = 'USA'
ORDER BY Population DESC
LIMIT 20;

Hasil:

+------+---------------+-------------+---------------+------------+------------+
| ID   | Name          | CountryCode | District      | Population | Size       |
+------+---------------+-------------+---------------+------------+------------+
| 3793 | New York      | USA         | New York      |    8008278 | Huge City  |
| 3794 | Los Angeles   | USA         | California    |    3694820 | Huge City  |
| 3795 | Chicago       | USA         | Illinois      |    2896016 | Huge City  |
| 3796 | Houston       | USA         | Texas         |    1953631 | Big City   |
| 3797 | Philadelphia  | USA         | Pennsylvania  |    1517550 | Big City   |
| 3798 | Phoenix       | USA         | Arizona       |    1321045 | Big City   |
| 3799 | San Diego     | USA         | California    |    1223400 | Big City   |
| 3800 | Dallas        | USA         | Texas         |    1188580 | Big City   |
| 3801 | San Antonio   | USA         | Texas         |    1144646 | Big City   |
| 3802 | Detroit       | USA         | Michigan      |     951270 | Small City |
| 3803 | San Jose      | USA         | California    |     894943 | Small City |
| 3804 | Indianapolis  | USA         | Indiana       |     791926 | Small City |
| 3805 | San Francisco | USA         | California    |     776733 | Small City |
| 3806 | Jacksonville  | USA         | Florida       |     735167 | Small City |
| 3807 | Columbus      | USA         | Ohio          |     711470 | Small City |
| 3808 | Austin        | USA         | Texas         |     656562 | Small City |
| 3809 | Baltimore     | USA         | Maryland      |     651154 | Small City |
| 3810 | Memphis       | USA         | Tennessee     |     650100 | Small City |
| 3811 | Milwaukee     | USA         | Wisconsin     |     596974 | Small City |
| 3812 | Boston        | USA         | Massachusetts |     589141 | Small City |
+------+---------------+-------------+---------------+------------+------------+

CASE dalam INSERT Pernyataan

Misalkan kita memiliki tabel berikut dalam database SQL Server:

+---------+-----------+-----------+--------------+
| DogId   | DogName   | GoodDog   | Dinner       |
|---------+-----------+-----------+--------------|
| 1001    | Brian     | 1         | Sunday Roast |
| 1002    | Rambo     | 0         | Airline food |
| 1003    | BamBam    | 1         | Sunday Roast |
+---------+-----------+-----------+--------------+

Mari kita masukkan baris baru ke dalam tabel itu. Tapi mari kita gunakan CASE ekspresi untuk memasukkan nilai yang sesuai ke dalam Dinner kolom, tergantung pada nilai di GoodDog kolom:

DECLARE @DogName nvarchar(60), @GoodDog bit;
SET @DogName = 'Lazy';
SET @GoodDog = 0;

INSERT INTO Dogs ( DogName, GoodDog, Dinner )
VALUES (
    @DogName,
    @GoodDog,
    CASE @GoodDog
        WHEN 1 THEN 'Sunday Roast'
        ELSE 'Airline food'
    END
    );

Di sini, CASE ekspresi mengevaluasi nilai variabel yang baru saja kita tetapkan, lalu memasukkan nilai yang sesuai ke dalam Dinner kolom.

Sekarang mari kita periksa lagi tabelnya:

SELECT * FROM Dogs;

Hasil:

+---------+-----------+-----------+--------------+
| DogId   | DogName   | GoodDog   | Dinner       |
|---------+-----------+-----------+--------------|
| 1001    | Brian     | 1         | Sunday Roast |
| 1002    | Rambo     | 0         | Airline food |
| 1003    | BamBam    | 1         | Sunday Roast |
| 1004    | Lazy      | 0         | Airline food |
+---------+-----------+-----------+--------------+

Kita dapat melihat bahwa nilai yang sesuai ada di Dinner kolom.

CASE dalam ORDER BY Klausa

CASE ekspresi dapat digunakan dalam pernyataan atau klausa apa pun yang memungkinkan ekspresi yang valid. Oleh karena itu, Anda dapat menggunakannya dalam pernyataan seperti SELECT , UPDATE , DELETE dan SET , dan dalam klausa seperti IN , WHERE , ORDER BY , GROUP BY , dan HAVING .

Menggunakan CASE ekspresi dalam ORDER BY statement pernyataan klausa dapat berguna ketika Anda ingin membuat pengecualian khusus untuk nilai tertentu saat memesan hasil Anda.

Misalkan kita menjalankan kueri berikut terhadap tabel yang berisi genre musik.

SELECT Genre 
FROM Genres
ORDER BY Genre ASC;

Hasil:

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

Di sini, kami mengurutkan hasil berdasarkan Genre kolom, dalam urutan menaik.

Ini baik-baik saja kecuali untuk satu hal. Genre yang disebut Other . Bukankah lebih baik jika kita bisa memindahkan Other ke bawah?

Kita dapat mencapai ini dengan CASE ekspresi dengan mengambil kueri di atas, dan memodifikasinya sebagai berikut.

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

Hasil:

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

COALESCE() dan NULLIF() Fungsi

Bergantung pada skenarionya, kita dapat menggunakan fungsi seperti COALESCE() dan NULLIF() sebagai jalan pintas, daripada menggunakan CASE ekspresi.

Kedua fungsi ini adalah standar SQL, dan berfungsi sebagai berikut:

NULLIF (V1, V2)

Setara dengan:

CASE WHEN V1=V2 THEN NULL ELSE V1 END

Dan:

COALESCE (V1, V2)

Setara dengan:

CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END

Juga:

COALESCE (V1, V2, ..., Vn)

Setara dengan:

CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, ..., Vn) END

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Memahami Statistik HAProxy untuk MySQL &PostgreSQL

  2. Cara Menampilkan Nilai Baris sebagai Kolom di MySQL

  3. Cara Membuat Database MySQL Menggunakan Command Line Interface (CLI)

  4. Pesan tabel MySQL dengan dua kolom

  5. SQL:Temukan rekor maksimum per grup