Pernyataan SQL CASE mengevaluasi dan mengembalikan hasil berdasarkan nilai, predikat, dan kondisi tertentu sesuai logika yang ditentukan. Misalnya, Anda memiliki tabel pemilih dengan detail berikut:
- Nomor Pemilih
- Nama
- DOB
Jika Anda mencari logika tentang kelayakan pemungutan suara, ini akan tergantung pada nilai di kolom DOB.
Jika usia pemilih lebih dari 18 tahun, mereka berhak memilih.
Mari kita lihat contoh lain. Sering kali, kami menyimpan nilai kolom dalam bit 1 atau 0. Katakanlah Anda menyimpan nilai ketersediaan produk sebagai 1 atau 0. Misalnya:
- 1 =Produk tersedia
- 0 =Produk kehabisan stok
Jika kita melihat perspektif database, itu adalah praktik yang baik untuk menggunakan singkatan atau bit sedapat mungkin. Ini bermanfaat bagi pengoptimal kueri SQL Server dalam menyiapkan rencana eksekusi yang dioptimalkan. Namun, dari perspektif aplikasi, pengguna akhir tidak memerlukan nilai-nilai ini. Pelanggan hanya perlu melihat apakah produk tersebut tersedia atau tidak.
Pada gambar di bawah, kita melihat database dan perspektif aplikasi.
Apa yang dilakukan pernyataan SQL CASE?
Pernyataan CASE di SQL Server mengevaluasi ekspresi dan mengembalikan nilai berdasarkan kondisi yang ditentukan. Oleh karena itu, pada contoh sebelumnya, pernyataan CASE berfungsi seperti yang ditunjukkan di bawah ini.
Pada tingkat tinggi, sintaks untuk pernyataan SQL CASE ditunjukkan di bawah ini. Di sini, kami menentukan beberapa kondisi. SQL Server mengevaluasi kondisi secara berurutan. Setelah suatu kondisi berhasil dievaluasi, evaluasi kondisi yang tersisa akan dihentikan. Jika tidak ada kondisi yang terpenuhi, kita dapat menggunakan pernyataan ELSE opsional untuk mengembalikan nilai default. Misalnya, jika kami memiliki nilai yang berbeda dengan 0 dan 1 di kolom ketersediaan, Anda mendapatkan output dari blok kode ELSE. Ini membutuhkan setidaknya satu set blok WHEN dan THEN. Pernyataan CASE harus diakhiri dengan blok END.
Mari kita jelajahi pernyataan SQL CASE menggunakan berbagai contoh.
Catatan:Dalam artikel ini, kami menggunakan database sampel Microsoft, AdventureWorks. Anda dapat mengunduh cadangannya dari Microsoft Docs.
Pernyataan SELECT dengan ekspresi CASE sederhana
Dalam jenis pernyataan CASE ini, kami menggunakan ekspresi pemeriksaan kesetaraan. Kueri berikut mengimplementasikan ekspresi CASE sederhana.
- Jika nilai di [SalariedFlag] adalah 1, maka akan ditampilkan Karyawan Aktif
- Untuk semua nilai lainnya, ini menampilkan output sebagai Karyawan Tidak Aktif
SELECT TOP 5 Nationalidnumber , CASE salariedflag WHEN 1 THEN 'Active Employee' ELSE 'Inactive Employee' END AS [Salaried Flag] FROM [AdventureWorks2019].[HumanResources].[employee]
Kita dapat menentukan beberapa kondisi untuk pernyataan CASE.
SELECT TOP 5 Nationalidnumber , CASE salariedflag WHEN 1 THEN 'Active Employee' WHEN 0 THEN 'Inactive Employee' ELSE 'Invalid Value' END AS [Salaried Flag] FROM [AdventureWorks2019].[HumanResources].[employee]
Standarisasi data menggunakan pernyataan SQL CASE
Biasanya, kami menggunakan singkatan untuk menyimpan nilai dalam tabel SQL. Singkatan standar adalah jenis kelamin, kode negara, status pernikahan, nama produk populer, dll.
Misalkan kita menentukan singkatan untuk menyimpan jenis kelamin karyawan. Sekarang, aplikasi kita akan menampilkan hasil tanpa singkatan.
Pernyataan SQL CASE membantu menstandardisasi output untuk kriteria yang ditentukan. Dalam kueri di bawah ini, kami menggunakan ketentuan berikut:
- Jika nilai gender adalah M , tampilkan sebagai Pria
- Jika nilai gender adalah F , tampilkan sebagai Wanita
- Untuk nilai lainnya, tampilkan Tidak Valid Nilai
SELECT DISTINCT CASE gender WHEN 'M' THEN 'Male' WHEN 'F' THEN 'Female' ELSE 'Invalid Value' END AS Gender FROM AdventureWorks2019.HumanResources.Employee
Menelusuri pernyataan KASUS
Dalam pernyataan CASE yang dicari, kami menentukan ekspresi CASE alih-alih nilai langsung. Setelah nilai ekspresi mengevaluasi dan memenuhi kondisi dalam klausa WHEN, nilai yang sesuai akan dikembalikan.
Lihatlah kueri SQL di bawah ini. Di sini, kami mendefinisikan ekspresi dalam klausa WHEN untuk [ListPrice]. Ini mengidentifikasi bahwa biaya produk adalah $250 dan ditandai sebagai barang Elektronik.
SELECT ProductNumber, Name, [Product category] = CASE WHEN ListPrice = 0 THEN 'Out of Stock items' WHEN ListPrice > 0 and ListPrice<=100 THEN 'Consumer goods' WHEN ListPrice >100 and ListPrice <= 500 THEN 'Electronics items' WHEN ListPrice >500 and ListPrice < 1500 THEN 'Luxury items' ELSE 'Extra items' END FROM Production.Product order by ListPrice desc
Untuk contoh gender yang disebutkan sebelumnya, kita dapat menulis ulang pernyataan SQL CASE untuk singkatan gender menggunakan pernyataan kasus yang dicari.
SELECT DISTINCT CASE WHEN Gender='M' THEN 'Male' WHEN Gender='F' THEN 'Female' ELSE 'Invalid Value' END AS Gender FROM AdventureWorks2019.HumanResources.Employee
Menggunakan pernyataan CASE dengan klausa ORDER BY
Kueri SQL menggunakan klausa ORDER BY untuk pengurutan data dalam urutan menaik atau menurun. Anda dapat menggunakan pernyataan CASE dalam hubungannya dengan klausa ORDER BY. Misalkan dari tabel produk, kami mengambil [ProductName] dan [ListPrice]. Kami ingin mengurutkan hasil dengan cara berikut:
- Jika harga jual produk kurang dari 2.000, Anda ingin hasilnya dalam urutan pengurutan default, yaitu menaik
- Jika harga jual produk lebih besar dari 2.000, pengurutan klausa ORDER BY menghasilkan urutan menurun
Dalam kueri ini, kami menggunakan dua pernyataan SQL CASE untuk mengimplementasikan logika.
SELECT Name, ListPrice FROM Production.Product ORDER BY CASE WHEN ListPrice<=2000 THEN ListPrice END ,CASE WHEN ListPrice >2000 THEN ListPrice END DESC
Dalam output kueri di bawah ini, Anda dapat memverifikasi jenis data yang muncul dalam urutan menurun dan menaik.
Dalam contoh lain, misalkan kita ingin mengurutkan data dalam tabel karyawan berdasarkan kondisi berikut:
- Untuk karyawan aktif (Bendera saat ini=1), data harus mengurutkan kolom tanggal perekrutan
- Untuk karyawan yang tidak aktif, harus mengurutkan data sesuai nilai di kolom tanggal lahir
SELECT NationalIDNumber,JobTitle,Hiredate,BirthDate, currentflag FROM AdventureWorks2019.HumanResources.Employee ORDER BY CASE CURRENTFLAG WHEN 1 THEN HireDate else Birthdate end
Dalam keluaran kueri, kami dapat memverifikasi urutan pengurutan data yang ditentukan oleh klausa ORDER BY dan pernyataan CASE.
Pernyataan CASE dalam SQL dan fungsi agregat
Fungsi agregat di SQL Server melakukan perhitungan dan mengembalikan nilai tunggal. Contoh fungsi agregat adalah MIN, MAX, COUNT, ABG dan CHECKSUM.
Misalkan kita ingin mengambil jumlah perekrutan karyawan untuk setiap tahun dari 2007-2010. Ini akan menampilkan hasil dalam format berikut:
Untuk tujuan ini, kami menggunakan fungsi COUNT agregat di SQL Server.
- Pertama, fungsi SQL DATEPART memfilter data menurut tahun. Misalnya, DATEPART(YY, Hiredate)=2007, memfilter data untuk tahun 2007.
- Kami kemudian menggunakan pernyataan CASE untuk mengembalikan 1 jika tahun adalah 2007.
- Fungsi hitung agregat menghitung catatan dan menampilkan hasilnya.
- Demikian pula, kueri berfungsi untuk tahun-tahun yang tersisa.
SELECT Count(CASE WHEN Datepart(yy, hiredate) = 2007 THEN 1 ELSE NULL END) AS [2007Hires], Count(CASE WHEN Datepart(yy, hiredate) = 2008 THEN 1 ELSE NULL END) AS [2008Hires], Count(CASE WHEN Datepart(yy, hiredate) = 2009 THEN 1 ELSE NULL END) AS [2009Hires], Count(CASE WHEN Datepart(yy, hiredate) = 2009 THEN 1 ELSE NULL END) AS [2010Hires] FROM AdventureWorks2019.HumanResources.Employee
Demikian pula, katakanlah kita ingin menggunakan fungsi agregat GROUP BY untuk mengelompokkan baris yang memiliki kategori produk yang sama. Kita dapat menentukan pernyataan CASE dalam SQL untuk mengurutkan data dari kumpulan hasil yang dikelompokkan.
SELECT [Product category] = CASE WHEN listprice = 0 THEN 'Out of Stock items' WHEN listprice > 0 AND listprice <= 100 THEN 'Consumer goods' WHEN listprice > 100 AND listprice <= 500 THEN 'Electronics items' WHEN listprice > 500 AND listprice < 1500 THEN 'Luxury items' ELSE 'Extra items' END, Min(listprice) AS MinPrice, Max(listprice) AS MaxPrice, Count(listprice) AS Numberofproducts FROM production.product GROUP BY CASE WHEN listprice = 0 THEN 'Out of Stock items' WHEN listprice > 0 AND listprice <= 100 THEN 'Consumer goods' WHEN listprice > 100 AND listprice <= 500 THEN 'Electronics items' WHEN listprice > 500 AND listprice < 1500 THEN 'Luxury items' ELSE 'Extra items' END ORDER BY numberofproducts DESC
Dalam kueri di atas, kami menggunakan dua pernyataan SQL CASE.
- Pernyataan CASE pertama mengkategorikan data berdasarkan ekspresi yang ditentukan dalam daftar harga. Dengan menggunakan pernyataan CASE ini, kami membagi produk ke dalam kategori berikut:
- Barang Kehabisan Stok
- Barang konsumsi
- Barang elektronik
- Barang mewah
- Dalam pernyataan kasus kedua, kami menggunakan fungsi agregat GROUP BY untuk mengelompokkan hasil berdasarkan kategori
- Selanjutnya, kami mengurutkan hasil berdasarkan NumberOfProducts dalam urutan menurun
Mencegah kesalahan pembagian dengan nol menggunakan pernyataan SQL CASE
Kesalahan bagi dengan nol terjadi jika nilai penyebutnya nol. Jika Anda melakukan pecahan ini di SQL Server, itu akan memberi Anda kesalahan pembagian dengan nol seperti yang ditunjukkan di bawah ini.
Ini adalah praktik yang sangat baik untuk menulis pertanyaan Anda dengan cara menghindari kesalahan umum ini. Untuk menghindari hal ini, kami menggunakan logika pecahan di dalam pernyataan CASE.
DECLARE @Student1 INT DECLARE @Student2 INT SET @Student1=100 SET @Student2=0 select CASE WHEN @Student2=0 THEN NULL ELSE @Student1/@Student2 end as StudentMarksRatio
Kami telah mengamankan kueri kami dari kesalahan pembagian dengan nol. Sekarang, dengan logika yang dimodifikasi, jika kita mendapatkan nol pada penyebut, Anda mendapatkan NULL pada output seperti yang ditunjukkan di bawah ini.
Pengingat yang berguna tentang pernyataan SQL CASE
- Pernyataan SQL CASE mendukung hingga 10 tingkat penyarangan
- Anda tidak dapat mengontrol aliran eksekusi pernyataan, fungsi, atau prosedur menggunakan ekspresi CASE
- Anda harus selalu menggunakan blok ELSE sehingga jika ada kondisi yang tidak terpenuhi, Anda mendapatkan nilai default
- Anda harus menghindari penggunaan kondisi yang bertentangan dalam pernyataan SQL CASE. Pernyataan CASE bekerja secara berurutan dan berhenti mengevaluasi dengan kondisi pertama yang berhasil