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

Menggunakan Ekspresi CASE di SQL Server

Pengantar

Ekspresi CASE di SQL Server digunakan untuk substitusi nilai kolom untuk menyajikan kumpulan hasil dengan cara tertentu atau kueri sederhana. Kasus penggunaan untuk perintah semacam itu beragam.

Misalnya, ada kolom yang berisi kode departemen, tetapi Anda ingin menampilkan nama departemen daripada kodenya. Anda dapat mencapainya dengan melakukan GABUNG dengan tabel lain yang berisi detail departemen. Namun, mari kita asumsikan Anda ingin membuat kueri relatif sederhana. Kasus penggunaan lain akan mengembalikan nilai spesifik untuk kumpulan nilai yang dihitung. Kolom yang dihitung tidak akan cocok jika kumpulan kondisi yang ditentukan tidak sama.

Biasanya, SQL Server CASE Expressions memiliki bentuk yang ditunjukkan pada Listing 1.

-- Listing 1: CASE Expression Syntax
-- Simple CASE Expression
SELECT 
  col1
, col2
, CASE col3
WHEN 'a' THEN 'xxx'
WHEN 'b' THEN 'yyy'
WHEN 'c' THEN 'zzz'
ELSE 'Invalid Value'
END AS col3_name
FROM table_name;

-- Searched CASE Expression
SELECT 
  col1
, col2
, CASE
WHEN col3 = 1 THEN 'xxx'
WHEN col3 BETWEEN 2 and 9 THEN 'yyy'
WHEN col3 > 10 THEN 'zzz'
ELSE 'Invalid Value'
END AS col3_name
FROM table_name;

Kasus Sederhana dan Kasus Penelusuran

Dua skenario yang dijelaskan di atas sangat cocok dengan dua jenis ekspresi CASE yang tersedia di SQL Server. Ekspresi CASE sederhana hanya memungkinkan pemeriksaan kesetaraan. Ekspresi CASE yang Dicari bahkan memungkinkan ekspresi Boolean.

Perhatikan bahwa hasil ekspresi CASE masuk ke dalam satu kolom. Juga, perhatikan bahwa kita menentukan nama kolom tepat setelah klausa CASE dalam ekspresi Simple CASE. Namun, dalam Ekspresi KASUS yang Dicari, kita harus menentukan nama kolom untuk setiap ekspresi Boolean. Mari kita jelajahi beberapa contohnya.

Lingkungan Skenario

Dalam eksplorasi ekspresi CASE, kita akan menggunakan database sampel WideWorldImporters yang terkenal. Di sana, kami akan menggunakan Sales.CustomerTransactions tabel untuk mendemonstrasikan berbagai skenario aplikasi ekspresi CASE. Seperti biasa dengan T-SQL, adalah mungkin untuk mendapatkan hasil serupa menggunakan teknik lain, seperti JOIN, tetapi kami fokus pada satu tabel untuk menunjukkan kemampuan ekspresi CASE.

Perhatikan bahwa seseorang harus memahami data yang ditangani untuk menggunakan ekspresi CASE. Misalnya, kita harus tahu apa yang dilakukan setiap pelanggan kode berarti mewakili data dengan lebih masuk akal bagi pengguna akhir. Dalam kasus kami, kami dapat memperoleh informasi dari tabel lain.

Listing 2 adalah kueri sederhana yang menunjukkan seperti apa data dalam tabel. Gambar 1 menunjukkan kepada kita bagian keluaran.

-- Listing 2: Data Set in Sales.CustomerTransactions
SELECT TOP (1000) [CustomerTransactionID]
      , [CustomerID]
      , [TransactionTypeID]
      , [InvoiceID]
      , [PaymentMethodID]
      , [TransactionDate]
      , [AmountExcludingTax]
      , [TaxAmount]
      , [TransactionAmount]
      , [OutstandingBalance]
      , [FinalizationDate]
      , [IsFinalized]
      , [LastEditedBy]
      , [LastEditedWhen]
  FROM [WideWorldImporters].[Sales].[CustomerTransactions] ;

Mengembalikan Nama Pelanggan Berdasarkan ID Pelanggan

Dalam contoh ini, kami ingin menampilkan nama setiap pelanggan berdasarkan kode pelanggan. Kami mendapatkan nama pelanggan dari tabel lain menggunakan kueri GABUNG. Sekali lagi, kami menggunakan CASE Expression untuk mendemonstrasikan apa yang dapat dilakukan oleh pendekatan ini.

-- Listing 3a: Determine Names Using a Join
select distinct top 10 b.CustomerID, a.CustomerName
from Sales.Customers a,Sales.CustomerTransactions b
where a.CustomerID = b.CustomerID;
-- Listing 3b: Determine Names Using a Join (Alternative)
select distinct top 10 b.CustomerID, a.CustomerName
from Sales.Customers a
inner join Sales.CustomerTransactions b
on a.CustomerID = b.CustomerID;

Dengan informasi ini, kami menulis kueri CASE sederhana untuk mengambil data dari Sales.CustomerTransactions saja (Lihat Daftar 4). Gambar 3 menyoroti nama yang dikembalikan oleh kueri.

Amati kemunculan 'Pelanggan Tidak Dikenal' dalam keluaran. Dalam arti sebenarnya, pelanggan ini tidak dikenal. Kami tidak memilikinya karena kami tidak memenuhi CustomerID mereka dalam ekspresi CASE kami. Ini mendukung kebutuhan untuk memahami data saat menggunakan CASE Expressions.

-- Listing 4: Simple CASE Expression for Customer Name
SELECT TOP (20) 
CASE CustomerID 
	WHEN 1 THEN 'Tailspin Toys'
	WHEN 401 THEN 'Wingtip Toys'
	WHEN 801 THEN 'Eric Torres'
	WHEN 802 THEN 'Cosmina Vlad'
	WHEN 803 THEN 'Bala Dixit'
	WHEN 804 THEN 'Alekxandrs Reikstins'
	WHEN 805 THEN 'Ratan Podder'
	WHEN 806 THEN 'Shi Tu'
	WHEN 807 THEN 'Gunnar Lohmus'
	WHEN 808 THEN 'Jackson Kolios'
ELSE 'Unknown Customer'
END CustomerName
      , [InvoiceID]
      , [TransactionDate]
      , [TransactionAmount]
      , [OutstandingBalance]
      , [IsFinalized]
	  , [FinalizationDate]
      , [LastEditedBy]
      , [LastEditedWhen]
  FROM [WideWorldImporters].[Sales].[CustomerTransactions];

Mengembalikan Kelas Pelanggan Berdasarkan Jumlah Transaksi

Dalam contoh ini, kami menggunakan ekspresi CASE Penelusuran untuk menunjukkan pelanggan mana yang lebih bernilai terkait nilai transaksi.

Kami mengklasifikasikan nasabah menjadi tiga kelompok – Regular, Silver, Gold, dan Platinum, berdasarkan nilai transaksinya. Tentu saja, ini sederhana. Dalam skenario dunia nyata, kita perlu menjumlahkan transaksi mereka selama periode tertentu. Dalam hal ini, kami hanya menggunakan subset data untuk menunjukkan kemampuan CASE Expression.

-- Listing 5: Searched Case Expression for Customer Class 
SELECT TOP (20) 
CASE CustomerID 
	WHEN 1 THEN 'Tailspin Toys'
	WHEN 401 THEN 'Wingtip Toys'
	WHEN 801 THEN 'Eric Torres'
	WHEN 802 THEN 'Cosmina Vlad'
	WHEN 803 THEN 'Bala Dixit'
	WHEN 804 THEN 'Alekxandrs Reikstins'
	WHEN 805 THEN 'Ratan Podder'
	WHEN 806 THEN 'Shi Tu'
	WHEN 807 THEN 'Gunnar Lohmus'
	WHEN 808 THEN 'Jackson Kolios'
ELSE 'Unknown Customer'
END CustomerName
      	, [InvoiceID]
	, [TransactionDate] 
, CASE  
	WHEN [TransactionAmount] BETWEEN 100 AND 1000 THEN 'Silver Customer'
	WHEN [TransactionAmount] BETWEEN 1000 AND 3000 THEN 'Gold Customer'
	WHEN [TransactionAmount] >= 3000 THEN 'Platinum Customer'
	ELSE 'Regular Customer'
	END AS CustomerClass
, [OutstandingBalance]
      	, [IsFinalized]
	  , [FinalizationDate]
      	, [LastEditedBy]
      	, [LastEditedWhen]
  FROM [WideWorldImporters].[Sales].[CustomerTransactions];

Mengembalikan Hari dalam Seminggu Menggunakan Ekspresi CASE Bertingkat

Kami melanjutkan dengan sampel dengan menambahkan sampel yang memberi tahu kami hari apa Tanggal Transaksi itu (Lihat Daftar 6). Perhatikan bahwa kita dapat mencapainya dengan menggunakan bentuk kueri yang lebih sederhana menggunakan fungsi DATENAME daripada fungsi DATEPART.

-- Listing 6: Case Expression for Day of Week Using A Function  
SELECT TOP (20) 
CASE CustomerID 
	WHEN 1 THEN 'Tailspin Toys'
	WHEN 401 THEN 'Wingtip Toys'
	WHEN 801 THEN 'Eric Torres'
	WHEN 802 THEN 'Cosmina Vlad'
	WHEN 803 THEN 'Bala Dixit'
	WHEN 804 THEN 'Alekxandrs Reikstins'
	WHEN 805 THEN 'Ratan Podder'
	WHEN 806 THEN 'Shi Tu'
	WHEN 807 THEN 'Gunnar Lohmus'
	WHEN 808 THEN 'Jackson Kolios'
ELSE 'Unknown Customer'
END CustomerName
      , [InvoiceID]
, CASE  
	WHEN DATEPART(WEEKDAY,[TransactionDate]) = 1 THEN 'Sunday'
	WHEN DATEPART(WEEKDAY,[TransactionDate]) = 2 THEN 'Monday'
	WHEN DATEPART(WEEKDAY,[TransactionDate]) = 3 THEN 'Tuesday'
	WHEN DATEPART(WEEKDAY,[TransactionDate]) = 4 THEN 'Wednesday'
	WHEN DATEPART(WEEKDAY,[TransactionDate]) = 5 THEN 'Thursday'
	WHEN DATEPART(WEEKDAY,[TransactionDate]) = 6 THEN 'Friday'
	WHEN DATEPART(WEEKDAY,[TransactionDate]) = 7 THEN 'Saturday'
	END AS [Day of Week]
, CASE  
	WHEN [TransactionAmount] BETWEEN 100 AND 1000 THEN 'Silver Customer'
	WHEN [TransactionAmount] BETWEEN 1000 AND 3000 THEN 'Gold Customer'
	WHEN [TransactionAmount] >= 3000 THEN 'Platinum Customer'
	ELSE 'Regular Customer'
	END AS CustomerClass
	  , [OutstandingBalance]
      , [IsFinalized]
	  , [FinalizationDate]
      , [LastEditedBy]
      , [LastEditedWhen]
  FROM [WideWorldImporters].[Sales].[CustomerTransactions];

Pelabelan Transaksi Berdasarkan Tanggal

Dengan menggunakan kode di Daftar 7 dan 8, kita dapat melabeli transaksi berdasarkan perbedaan antara tanggal saat ini dan tanggal transaksi. Hal ini juga berlaku untuk perbedaan antara tanggal transaksi dan kolom lainnya. Oleh karena itu, kami dapat memperkenalkan kolom selain yang sedang kami kerjakan sebagai input ke ekspresi Boolean.

  -- Listing 7: Case Expression for Transaction by Comparing Two “Columns”
SELECT TOP (20) 
CASE CustomerID 
	WHEN 1 THEN 'Tailspin Toys'
	WHEN 401 THEN 'Wingtip Toys'
	WHEN 801 THEN 'Eric Torres'
	WHEN 802 THEN 'Cosmina Vlad'
	WHEN 803 THEN 'Bala Dixit'
	WHEN 804 THEN 'Alekxandrs Reikstins'
	WHEN 805 THEN 'Ratan Podder'
	WHEN 806 THEN 'Shi Tu'
	WHEN 807 THEN 'Gunnar Lohmus'
	WHEN 808 THEN 'Jackson Kolios'
ELSE 'Unknown Customer'
END CustomerName
      , [InvoiceID]
, CASE  
	WHEN DATEDIFF(DAY,[TransactionDate],GETDATE()) < 30 THEN 'Current Transaction'
	WHEN DATEDIFF(DAY,[TransactionDate],GETDATE()) BETWEEN 30 AND 90 THEN 'Old Transaction'
	WHEN DATEDIFF(DAY,[TransactionDate],GETDATE()) BETWEEN 90 AND 365 THEN 'Stale Transaction'
	WHEN DATEDIFF(DAY,[TransactionDate],GETDATE()) >= 365 THEN 'Archived Transaction'
	END AS [Transaction Age]
, CASE  
	WHEN [TransactionAmount] BETWEEN 100 AND 1000 THEN 'Silver Customer'
	WHEN [TransactionAmount] BETWEEN 1000 AND 3000 THEN 'Gold Customer'
	WHEN [TransactionAmount] >= 3000 THEN 'Platinum Customer'
	ELSE 'Regular Customer'
	END AS CustomerClass
	  , [OutstandingBalance]
      , [IsFinalized]
	  , [FinalizationDate]
      , [LastEditedBy]
      , [LastEditedWhen]
  FROM [WideWorldImporters].[Sales].[CustomerTransactions];
-- Listing 8: Case Expression for Transaction by Comparing Two Columns  
SELECT TOP (20) 
CASE CustomerID 
	WHEN 1 THEN 'Tailspin Toys'
	WHEN 401 THEN 'Wingtip Toys'
	WHEN 801 THEN 'Eric Torres'
	WHEN 802 THEN 'Cosmina Vlad'
	WHEN 803 THEN 'Bala Dixit'
	WHEN 804 THEN 'Alekxandrs Reikstins'
	WHEN 805 THEN 'Ratan Podder'
	WHEN 806 THEN 'Shi Tu'
	WHEN 807 THEN 'Gunnar Lohmus'
	WHEN 808 THEN 'Jackson Kolios'
ELSE 'Unknown Customer'
END CustomerName
      , [InvoiceID]
, CASE  
	WHEN DATEDIFF(DAY,[TransactionDate],[FinalizationDate]) < 30 THEN 'Prompt Transaction'
	WHEN DATEDIFF(DAY,[TransactionDate],[FinalizationDate]) BETWEEN 30 AND 90 THEN 'Delayed Transaction'
	WHEN DATEDIFF(DAY,[TransactionDate],[FinalizationDate]) BETWEEN 90 AND 365 THEN 'Serverely Delayed Transaction'
	WHEN DATEDIFF(DAY,[TransactionDate],[FinalizationDate]) >= 365 THEN 'Orphaned Transaction'
	END AS [Transaction Response]
, CASE  
	WHEN [TransactionAmount] BETWEEN 100 AND 1000 THEN 'Silver Customer'
	WHEN [TransactionAmount] BETWEEN 1000 AND 3000 THEN 'Gold Customer'
	WHEN [TransactionAmount] >= 3000 THEN 'Platinum Customer'
	ELSE 'Regular Customer'
	END AS CustomerClass
, [OutstandingBalance]
      	, [IsFinalized]
, [FinalizationDate]
      	, [LastEditedBy]
      	, [LastEditedWhen]
  FROM [WideWorldImporters].[Sales].[CustomerTransactions];

Ekspresi KASUS Di Luar Daftar SELECT

Kita juga dapat menggunakan ekspresi CASE dalam pernyataan SET, pernyataan UPDATE, klausa WHERE, Klausa HAVING, dan Klausa ORDER BY.

Pernyataan Update di Listing 9 memperbarui OutstandingBalance kolom baris dengan empat ID pelanggan berbeda yang memiliki nilai berbeda. Pernyataan ini setara dengan menulis lima pernyataan pembaruan yang berbeda untuk setiap KASUS dan kemudian ELSE.

-- Listing 9: Update Statement with CASE Expression 
  UPDATE Sales.CustomerTransactions
  SET OutstandingBalance =
	(CASE 
		WHEN CustomerID = 832 THEN 100.00
		WHEN CustomerID = 803 THEN 150.00
		WHEN CustomerID = 905 THEN 200.00
		WHEN CustomerID = 976 THEN 70.00
		ELSE 50.00
	END
	);
	SELECT TOP 20 * FROM Sales.CustomerTransactions;

Kesimpulan

SQL dan T-SQL memungkinkan Anda untuk mengganti nilai yang disimpan dalam kolom dengan nilai yang Anda inginkan. Dalam artikel ini, kami telah menjelajahi ekspresi CASE Sederhana dan Penelusuran dengan contoh.

Ekspresi CASE dapat digunakan pada klausa SELECT, pernyataan SET, pernyataan UPDATE, klausa WHERE, HAVING, dan ORDER BY.

Referensi

KASUS
Fungsi Tanggal dan Waktu


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SSMS Kini Hadir dengan Azure Data Studio

  2. Permintaan untuk mendapatkan hanya angka dari string

  3. Perbaiki "Setidaknya salah satu argumen untuk COALESCE harus berupa ekspresi yang bukan konstanta NULL" di SQL Server

  4. Kapan saya perlu menggunakan Blok Mulai / Akhir dan kata kunci Go di SQL Server?

  5. 6 Fungsi untuk Mendapatkan Hari, Bulan, dan Tahun dari Tanggal di SQL Server