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