Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Pernyataan SQL CASE:Apa itu dan apa cara terbaik untuk menggunakannya?

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menyiram buffer PRINT di TSQL?

  2. Bagaimana cara menghasilkan rentang angka antara dua angka?

  3. JDBC SQLServerException:Driver ini tidak dikonfigurasi untuk otentikasi terintegrasi.

  4. Menghubungkan SQL Server ke PostgreSQL

  5. Cara membagi string dan memasukkan nilai ke dalam tabel di SQL Server