Di SQL Server, T-SQL CASE
ekspresi adalah ekspresi skalar yang mengembalikan nilai berdasarkan logika kondisional. Ini mengevaluasi daftar kondisi dan mengembalikan nilai, berdasarkan hasil dari kondisi tersebut..
Dalam beberapa hal, SQL Server CASE
ekspresinya mirip dengan IF...ELSE
. Namun, CASE
memungkinkan Anda untuk memeriksa beberapa kondisi, sedangkan IF...ELSE
tidak.
Juga, di SQL Server, IF...ELSE
adalah kata kunci bahasa kontrol aliran, sedangkan CASE
tidak. CASE
ekspresi tidak dapat digunakan untuk mengontrol aliran eksekusi pernyataan T-SQL, blok pernyataan, fungsi yang ditentukan pengguna, dan prosedur tersimpan.
2 Bentuk Ekspresi KASUS
Ada dua bentuk CASE
ekspresi di SQL Server:
CASE
sederhana ekspresi- Menelusuri
CASE
ekspresi
Ini dijelaskan dengan contoh di bawah ini.
Form 1 – Ekspresi KASUS Sederhana
CASE
sederhana ekspresi membandingkan ekspresi dengan sekumpulan ekspresi sederhana untuk menentukan hasilnya.
Berikut adalah contoh dasar untuk mendemonstrasikan bagaimana CASE
ekspresi berfungsi di SQL Server.
DECLARE @stock_ticker varchar(4) = 'V';
SELECT Company =
CASE @stock_ticker
WHEN 'AAPL' THEN 'Apple'
WHEN 'FB' THEN 'Facebook'
WHEN 'V' THEN 'Visa'
ELSE 'Not in the portfolio'
END
Hasil:
+-----------+| Perusahaan ||-----------|| Visa |+-----------+
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, ticker saham V
cocok dengan WHEN
third ketiga ekspresi, dan ekspresi yang diberikan oleh THEN
dikembalikan.
Untuk lebih jelasnya, CASE
yang sebenarnya ekspresi adalah bagian ini:
CASE @stock_ticker
WHEN 'AAPL' THEN 'Apple'
WHEN 'FB' THEN 'Facebook'
WHEN 'MA' THEN 'Mastercard'
WHEN 'V' THEN 'Visa'
ELSE 'Not in the portfolio'
END
Apa CASE
dilakukan adalah, ia memeriksa nilai setiap WHEN
ekspresi terhadap ekspresi input. Dalam contoh saya, @stock_ticker
variabel adalah ekspresi input. Oleh karena itu, ia memeriksa nilai setiap WHEN
ekspresi terhadap @stock_ticker
variabel.
Ketika/jika menemukan kecocokan, maka ia mengembalikan ekspresi yang diberikan oleh THEN
.
Contoh saya menggunakan tiga WHEN
ekspresi, tetapi bisa lebih dan bisa lebih sedikit, tergantung pada kebutuhan saya.
Formulir 2 – Ekspresi KASUS yang Dicari
CASE
. yang dicari ekspresi mengevaluasi satu set ekspresi Boolean untuk menentukan hasilnya.
Berikut adalah contoh CASE
yang dicari ekspresi.
DECLARE @price int = 1500;
SELECT Affordability =
CASE
WHEN @price < 100 THEN 'Cheap'
WHEN @price >= 100 AND @price < 500 THEN 'Affordable'
ELSE 'Expensive'
END
Hasil:
+-----------------+| Keterjangkauan ||-----------------|| Mahal |+-----------------+
CASE
searched yang dicari ekspresi tidak memiliki ekspresi input seperti CASE
sederhana ekspresi.
Anda akan mengingatnya dalam CASE
sederhana kami ekspresi, itu dimulai dengan CASE
@stock_ticker
, dan karena itu kami tahu bahwa WHEN
ekspresi semuanya mengevaluasi terhadap nilai @stock_ticker
.
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 WideWorldImporters;
SELECT
CityName AS [City],
LatestRecordedPopulation AS [Population],
Size =
CASE
WHEN LatestRecordedPopulation < 2000000 THEN 'Small City'
WHEN LatestRecordedPopulation >= 2000000 AND LatestRecordedPopulation < 3000000 THEN 'Big City'
ELSE 'Really Big City'
END
FROM Application.Cities
WHERE LatestRecordedPopulation > 1000000;
Hasil:
+-------------+--------------+---------------- -+| Kota | Populasi | Ukuran ||--------------+--------------+----------------- || Brooklyn | 2565635 | Kota Besar || Chicago | 2695598 | Kota Besar || Dallas | 1197816 | Kota Kecil || Houston | 2099451 | Kota Besar || Los Angeles | 3792621 | Benar-benar Kota Besar || Manhattan | 1619090 | Kota Kecil || New York | 8175133 | Benar-benar Kota Besar || Philadelphia | 1526006 | Kota Kecil || Phoenix | 1445632 | Kota Kecil || Ratu | 2272771 | Kota Besar || San Antonio | 1327407 | Kota Kecil || San Diego | 1307402 | Kota Kecil || Bronx | 1408473 | Kota Kecil |+------------+--------------+---------------- -+
Contoh ini menggunakan pencarian CASE
ekspresi untuk mengevaluasi hasil dari LatestRecordedPopulation
kolom Application.Cities
meja.
Tipe Data
Di SQL Server, tipe data dari ekspresi input dan WHEN
ekspresi harus sama atau harus merupakan konversi implisit.
Inilah yang terjadi jika tidak:
DECLARE @stock_ticker varchar(4) = 'V';
SELECT Company =
CASE @stock_ticker
WHEN 1 THEN 'Apple'
WHEN 2 THEN 'Facebook'
WHEN 3 THEN 'Mastercard'
WHEN 4 THEN 'Visa'
ELSE 'Not in the portfolio'
END
Hasil:
Pesan 245, Level 16, Status 1, Baris 3Konversi gagal saat mengonversi nilai varchar 'V' ke tipe data int.
Urutan Evaluasi
T-SQL CASE
ekspresi mengevaluasi kondisinya secara berurutan dan berhenti dengan kondisi pertama yang kondisinya terpenuhi.
Untuk mendemonstrasikan ini, mari gunakan beberapa WHEN
ekspresi yang memiliki nilai yang sama:
DECLARE @stock_ticker varchar(4) = 'V';
SELECT Company =
CASE @stock_ticker
WHEN 'V' THEN 'Visa 1'
WHEN 'V' THEN 'Visa 2'
WHEN 'V' THEN 'Visa 3'
ELSE 'Not in the portfolio'
END
Hasil:
+-----------+| Perusahaan ||-----------|| Visa 1 |+-------+
Dalam hal ini, berhenti pada WHEN
pertama ekspresi.
Mungkin ada skenario sesekali di mana ekspresi dievaluasi sebelum CASE
ekspresi menerima hasil ekspresi sebagai inputnya. Dalam skenario seperti itu, Anda bisa berakhir dengan kesalahan. Ini bisa terjadi jika Anda menyertakan ekspresi agregat sebagai WHEN
ekspresi.
Untuk alasan ini, Microsoft menyarankan agar:
Anda seharusnya hanya bergantung pada urutan evaluasi kondisi WHEN untuk ekspresi skalar (termasuk subkueri yang tidak berkorelasi yang mengembalikan skalar), bukan untuk ekspresi agregat.
ELSE adalah Opsional
ELSE
argumen adalah opsional. Oleh karena itu, kita dapat menulis ulang contoh “keterjangkauan” kita sebagai berikut:
DECLARE @price int = 1500;
SELECT Affordability =
CASE
WHEN @price < 100 THEN 'Cheap'
WHEN @price >= 100 AND @price < 500 THEN 'Affordable'
WHEN @price >= 500 THEN 'Expensive'
END
Hasil:
+-----------------+| Keterjangkauan ||-----------------|| Mahal |+-----------------+
Meskipun demikian, perhatikan bahwa Anda dapat berakhir dengan NULL
jika Anda menghilangkan ELSE
argumen.
Contoh berikut menghasilkan NULL
:
DECLARE @price int = 1500;
SELECT Affordability =
CASE
WHEN @price < 100 THEN 'Cheap'
WHEN @price >= 100 AND @price < 500 THEN 'Affordable'
WHEN @price >= 500 AND @price < 1000 THEN 'Expensive'
END
Hasil:
+-----------------+| Keterjangkauan ||-----------------|| NULL |+-----------------+
Dalam kasus seperti itu, kami selalu dapat menambahkan ELSE
argumen, untuk berjaga-jaga (maaf tentang permainan kata-kata!):
DECLARE @price int = 1500;
SELECT Affordability =
CASE
WHEN @price < 100 THEN 'Cheap'
WHEN @price >= 100 AND @price < 500 THEN 'Affordable'
WHEN @price >= 500 AND @price < 1000 THEN 'Expensive'
ELSE 'Unknown'
END
Hasil:
+-----------------+| Keterjangkauan ||-----------------|| Tidak diketahui |+-----------------+
Memang, contoh ini mungkin agak dibuat-buat. Lagi pula, tidak perlu membatasi "mahal". Jika ada sesuatu yang mahal di bawah $1000, maka mahal juga jika di atas $1000.
Tapi intinya, Anda bisa menggunakan ELSE
untuk menangkap apa pun yang tidak tercakup oleh WHEN
ekspresi/s.
Ekspresi KASUS Bersarang
Anda dapat membuat sarang CASE
ekspresi jika diperlukan.
DECLARE @price int, @on_sale bit;
SET @price = 1500;
SET @on_sale = 1;
SELECT Affordability =
CASE
WHEN @price < 100 THEN 'Cheap'
WHEN @price >= 100 THEN
CASE @on_sale
WHEN 0 THEN 'Expensive (but it''s not currently on sale)'
WHEN 1 THEN 'Expensive (and it''s already on sale!)'
END
END
Hasil:
+---------------------------------------+| Keterjangkauan ||---------------------------------------|| Mahal (dan sudah dijual!) |+--------------------------------------- +
Namun, penting untuk diperhatikan bahwa hanya 10 level penyarangan yang diizinkan untuk CASE
ekspresi di SQL Server. Jika Anda mencoba menyarangkan lebih dari 10 level, Anda akan mendapatkan kesalahan.
KASUS dalam ORDER BY Clause
Seperti disebutkan, T-SQL 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 MusicGenres
ORDER BY Genre ASC;
Hasil:
+--------+| Genre ||---------|| Biru || Negara || Hip Hop || Jazz || Logam || Lainnya || Pop || Rap || Batu |+---------+
Di sini, 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 dengan mengambil kueri di atas, dan memodifikasinya sebagai berikut.
SELECT Genre
FROM MusicGenres
ORDER BY
CASE Genre
WHEN 'Other' THEN 1
ELSE 0
END
ASC, Genre ASC;
Hasil:
+--------+| Genre ||---------|| Biru || Negara || Hip Hop || Jazz || Logam || Pop || Rap || Batu || Lainnya |+---------+
KASUS dalam Pernyataan UPDATE
Berikut ini contoh penggunaan CASE
ekspresi dalam UPDATE
pernyataan.
Misalkan kita memiliki tabel berikut:
+---------+-----------+-----------+----------+| ID Anjing | Nama Anjing | Anjing Baik | Makan malam ||--------+-----------+-----------+----------|| 1 | Ambil | 1 | NULL || 2 | Halus | 0 | NULL || 3 | goyang | 0 | NULL || 1001 | Brian | 1 | NULL || 1002 | Rambo | 0 | NULL || 1003 | BamBam | 1 | NULL |+---------+-----------+-----------+----------+Kami baru saja menambahkan
Dinner
kolom, dan masihNULL
, menunggu nilai dimasukkan.Tetapi nilai yang akan dimasukkan akan tergantung pada nilai
GoodDog
kolom.Kita bisa menggunakan
CASE
ekspresi dalam skenario seperti itu.UPDATE Dogs SET Dinner = CASE GoodDog WHEN 1 THEN 'Sunday Roast' ELSE 'Airline food' END SELECT * FROM Dogs;
Hasil:
+--------+-----------+-----------+------------ --+| ID Anjing | Nama Anjing | Anjing Baik | Makan malam ||--------+-----------+-----------+------------- -|| 1 | Ambil | 1 | Minggu Panggang || 2 | Halus | 0 | Makanan maskapai || 3 | goyang | 0 | Makanan maskapai || 1001 | Brian | 1 | Minggu Panggang || 1002 | Rambo | 0 | Makanan maskapai || 1003 | BamBam | 1 | Sunday Roast |+--------+------------+-----------+------------ --+KASUS dalam Pernyataan INSERT
Kita dapat mengambil tabel dari contoh di atas, dan memasukkan nilai baru.
Dan kita dapat kembali memanfaatkan
CASE
ekspresi untuk memasukkan nilai yang sesuai ke dalamDinner
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 ); SELECT * FROM Dogs;
Hasil:
+--------+-----------+-----------+------------ --+| ID Anjing | Nama Anjing | Anjing Baik | Makan malam ||--------+-----------+-----------+------------- -|| 1 | Ambil | 1 | Minggu Panggang || 2 | Halus | 0 | Makanan maskapai || 3 | goyang | 0 | Makanan maskapai || 1001 | Brian | 1 | Minggu Panggang || 1002 | Rambo | 0 | Makanan maskapai || 1003 | BamBam | 1 | Minggu Panggang || 1004 | malas | 0 | Makanan maskapai |+--------+------------+-----------+------------ --+Kali ini
CASE
ekspresi sedang mengevaluasi nilai variabel yang baru saja kita tetapkan, lalu memasukkan nilai yang sesuai ke dalamDinner
kolom.Apakah itu Pernyataan KASUS atau Ekspresi KASUS?
Dalam SQL, banyak hal yang disebut sebagai "pernyataan" padahal sebenarnya, itu adalah sesuatu yang lain. Ini juga tampaknya benar untuk T-SQL “
CASE
pernyataan”.Meskipun sering disebut sebagai
CASE
pernyataan, lebih akurat untuk menyebutnyaCASE
ekspresi . Ini juga bagaimana dokumentasi Microsoft merujuknya.Di SQL Server, alih-alih menjadi pernyataan itu sendiri,
CASE
dapat digunakan dalam pernyataan atau klausa apa pun yang memungkinkan ekspresi yang valid. Ekspresi adalah kombinasi simbol dan operator yang dievaluasi untuk mendapatkan nilai data tunggal.Namun, beberapa DBMS membedakan antara
CASE
pernyataan, danCASE
ekspresi, dan memiliki sintaks yang sedikit berbeda untuk masing-masing. MySQL membedakan antaraCASE
pernyataan danCASE
operator, yang pada dasarnya sama denganCASE
ekspresi.