Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Sistem Platform Analitik (PDW)
Titik akhir analitik SQL di Microsoft Fabric
Gudang di Microsoft Fabric
Database SQL di Microsoft Fabric
Mengevaluasi daftar kondisi dan mengembalikan salah satu dari beberapa kemungkinan ekspresi hasil.
Ekspresi CASE memiliki dua format:
Ekspresi sederhana
CASEmembandingkan ekspresi dengan sekumpulan ekspresi sederhana untuk menentukan hasilnya.Ekspresi yang dicari
CASEmengevaluasi sekumpulan ekspresi Boolean untuk menentukan hasilnya.
Kedua format mendukung argumen opsional ELSE .
CASE dapat digunakan dalam pernyataan atau klausa apa pun yang memungkinkan ekspresi yang valid. Misalnya, Anda dapat menggunakan CASE dalam pernyataan seperti SELECT, , UPDATEDELETEdan SET, dan dalam klausa seperti <select_list>, , IN, WHEREORDER BY, dan HAVING.
Syntax
Sintaks untuk SQL Server, Azure SQL Database, dan Azure Synapse Analytics.
-- Simple CASE expression:
CASE input_expression
WHEN when_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
-- Searched CASE expression:
CASE
WHEN Boolean_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
Sintaks untuk Gudang Data Paralel.
CASE
WHEN when_expression THEN result_expression [ ...n ]
[ ELSE else_result_expression ]
END
Arguments
input_expression
Ekspresi dievaluasi saat format sederhana CASE digunakan.
input_expression adalah ekspresi yang valid.
KAPAN when_expression
Ekspresi sederhana yang input_expression dibandingkan saat format sederhana CASE digunakan.
when_expression adalah ekspresi yang valid. Jenis data input_expression dan setiap when_expression harus sama atau harus berupa konversi implisit.
KEMUDIAN result_expression
Ekspresi yang dikembalikan saat input_expression sama dengan when_expression mengevaluasi ke TRUE, atau Boolean_expression mengevaluasi ke TRUE.
ekspresi hasil adalah ekspresi yang valid.
else_result_expression LAIN
Ekspresi dikembalikan jika tidak ada operasi perbandingan yang dievaluasi ke TRUE. Jika argumen ini dihilangkan dan tidak ada operasi perbandingan yang dievaluasi ke TRUE, CASE mengembalikan NULL.
else_result_expression adalah ekspresi yang valid. Jenis data else_result_expression dan result_expression apa pun harus sama atau harus berupa konversi implisit.
KAPAN Boolean_expression
Ekspresi Boolean dievaluasi saat menggunakan format yang dicari CASE .
Boolean_expression adalah ekspresi Boolean yang valid.
Tipe pengembalian
Mengembalikan jenis prioritas tertinggi dari kumpulan jenis dalam result_expressions dan else_result_expression opsional. Untuk informasi selengkapnya, lihat Prioritas jenis data.
Mengembalikan nilai
Ekspresi CASE sederhana
Ekspresi sederhana CASE beroperasi dengan membandingkan ekspresi pertama dengan ekspresi di setiap WHEN klausa untuk kesetaraan. Jika ekspresi ini setara, ekspresi dalam THEN klausa dikembalikan.
Hanya mengizinkan pemeriksaan kesetaraan.
Dalam urutan yang ditentukan, mengevaluasi input_expression = when_expression untuk setiap
WHENklausa.Mengembalikan result_expressionwhen_expression input_expression = pertama yang dievaluasi ke .
TRUEJika tidak ada input_expression = when_expression mengevaluasi ke
TRUE, Mesin Database SQL Server mengembalikan else_result_expression jikaELSEklausul ditentukan, atauNULLnilai jika tidak adaELSEklausa yang ditentukan.
Ekspresi CASE yang dicari
Mengevaluasi, dalam urutan yang ditentukan, Boolean_expression untuk setiap
WHENklausa.Mengembalikan result_expressiondari Boolean_expression pertama yang mengevaluasi ke
TRUE.Jika tidak ada Boolean_expression yang dievaluasi ke
TRUE, Mesin Database mengembalikan else_result_expression jikaELSEklausa ditentukan, atauNULLnilai jika tidak adaELSEklausul yang ditentukan.
Remarks
SQL Server hanya memungkinkan 10 tingkat bersarang dalam CASE ekspresi.
Ekspresi CASE tidak dapat digunakan untuk mengontrol alur eksekusi pernyataan Transact-SQL, blok pernyataan, fungsi yang ditentukan pengguna, dan prosedur tersimpan. Untuk daftar metode control-of-flow, lihat Control-of-Flow.
Ekspresi CASE mengevaluasi kondisinya secara berurutan dan berhenti dengan kondisi pertama yang kondisinya terpenuhi. Dalam beberapa situasi, ekspresi dievaluasi sebelum CASE ekspresi menerima hasil ekspresi sebagai inputnya. Kesalahan dalam mengevaluasi ekspresi ini dimungkinkan. Ekspresi agregat yang muncul dalam WHEN argumen ke CASE ekspresi dievaluasi terlebih dahulu, lalu disediakan untuk CASE ekspresi. Misalnya, kueri berikut menghasilkan kesalahan dibagi dengan nol saat menghasilkan nilai MAX agregat. Langkah ini terjadi sebelum mengevaluasi CASE ekspresi.
WITH Data (value)
AS (
SELECT 0
UNION ALL
SELECT 1
)
SELECT CASE
WHEN MIN(value) <= 0 THEN 0
WHEN MAX(1 / value) >= 100 THEN 1
END
FROM Data;
GO
Anda hanya boleh bergantung pada urutan evaluasi WHEN kondisi untuk ekspresi skalar (termasuk subkueri yang tidak terkait yang mengembalikan skalar), bukan untuk ekspresi agregat.
Anda juga harus memastikan bahwa setidaknya salah satu ekspresi dalam THEN klausa atau ELSE bukan NULL konstanta. Meskipun NULL dapat dikembalikan dari beberapa ekspresi hasil, tidak semuanya dapat secara eksplisit menjadi NULL konstanta. Jika semua ekspresi hasil menggunakan NULL konstanta, kesalahan 8133 dikembalikan.
Examples
Sampel kode dalam artikel ini menggunakan database sampel AdventureWorks2025 atau AdventureWorksDW2025, yang dapat Anda unduh dari halaman beranda Sampel dan Proyek Komunitas Microsoft SQL Server.
A. Menggunakan pernyataan SELECT dengan ekspresi CASE sederhana
Dalam pernyataan SELECT , ekspresi sederhana CASE hanya memungkinkan pemeriksaan kesetaraan; tidak ada perbandingan lain yang dibuat. Contoh berikut menggunakan CASE ekspresi untuk mengubah tampilan kategori baris produk agar lebih dapat dimengerti.
USE AdventureWorks2022;
GO
SELECT ProductNumber,
Category = CASE ProductLine
WHEN 'R' THEN 'Road'
WHEN 'M' THEN 'Mountain'
WHEN 'T' THEN 'Touring'
WHEN 'S' THEN 'Other sale items'
ELSE 'Not for sale'
END,
Name
FROM Production.Product
ORDER BY ProductNumber;
GO
B. Menggunakan pernyataan SELECT dengan ekspresi CASE yang dicari
SELECT Dalam pernyataan, ekspresi yang dicari CASE memungkinkan nilai diganti dalam tataan hasil berdasarkan nilai perbandingan. Contoh berikut menampilkan harga daftar sebagai komentar teks berdasarkan rentang harga untuk produk.
USE AdventureWorks2022;
GO
SELECT ProductNumber,
Name,
"Price Range" = CASE
WHEN ListPrice = 0 THEN 'Mfg item - not for resale'
WHEN ListPrice < 50 THEN 'Under $50'
WHEN ListPrice >= 50 AND ListPrice < 250 THEN 'Under $250'
WHEN ListPrice >= 250 AND ListPrice < 1000 THEN 'Under $1000'
ELSE 'Over $1000'
END
FROM Production.Product
ORDER BY ProductNumber;
GO
C. Menggunakan CASE dalam klausa ORDER BY
Contoh berikut menggunakan CASE ekspresi dalam ORDER BY klausul untuk menentukan urutan pengurutan baris berdasarkan nilai kolom tertentu. Dalam contoh pertama, nilai dalam SalariedFlag kolom HumanResources.Employee tabel dievaluasi. Karyawan yang memiliki SalariedFlag set ke 1 dikembalikan dalam BusinessEntityID urutan menurut. Karyawan yang memiliki SalariedFlag set ke 0 dikembalikan dalam urutan BusinessEntityID naik.
SELECT BusinessEntityID,
SalariedFlag
FROM HumanResources.Employee
ORDER BY CASE SalariedFlag
WHEN 1 THEN BusinessEntityID
END DESC,
CASE
WHEN SalariedFlag = 0 THEN BusinessEntityID
END;
GO
Dalam contoh kedua, tataan hasil diurutkan menurut kolom TerritoryName saat kolom CountryRegionName sama dengan 'Amerika Serikat' dan untuk CountryRegionName semua baris lainnya.
SELECT BusinessEntityID,
LastName,
TerritoryName,
CountryRegionName
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL
ORDER BY CASE CountryRegionName
WHEN 'United States' THEN TerritoryName
ELSE CountryRegionName
END;
GO
D. Menggunakan CASE dalam pernyataan UPDATE
Contoh berikut menggunakan CASE ekspresi dalam UPDATE pernyataan untuk menentukan nilai yang diatur untuk kolom VacationHours untuk karyawan dengan SalariedFlag diatur ke 0. Ketika mengurangi 10 jam dari VacationHours menghasilkan nilai negatif, VacationHours ditingkatkan 40 jam; jika tidak, VacationHours ditingkatkan 20 jam. Klausa OUTPUT digunakan untuk menampilkan nilai sebelum dan sesudah liburan.
USE AdventureWorks2022;
GO
UPDATE HumanResources.Employee
SET VacationHours = (
CASE
WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40
ELSE (VacationHours + 20.00)
END
)
OUTPUT Deleted.BusinessEntityID,
Deleted.VacationHours AS BeforeValue,
Inserted.VacationHours AS AfterValue
WHERE SalariedFlag = 0;
GO
E. Menggunakan CASE dalam pernyataan SET
Contoh berikut menggunakan CASE ekspresi dalam SET pernyataan dalam fungsi dbo.GetContactInfobernilai tabel .
AdventureWorks2025 Dalam database, semua data yang terkait dengan orang disimpan dalam Person.Person tabel. Misalnya, orang tersebut mungkin karyawan, perwakilan vendor, atau pelanggan. Fungsi mengembalikan nama depan (FirstName) dan nama keluarga (LastName) dari yang diberikan BusinessEntityID dan jenis kontak untuk orang tersebut. Ekspresi CASE dalam SET pernyataan menentukan nilai yang akan ditampilkan untuk kolom ContactType berdasarkan keberadaan BusinessEntityID kolom dalam Employeetabel , , Vendoratau Customer .
USE AdventureWorks2022;
GO
CREATE FUNCTION dbo.GetContactInformation (
@BusinessEntityID INT
)
RETURNS
@retContactInformation TABLE (
BusinessEntityID INT NOT NULL,
FirstName NVARCHAR (50) NULL,
LastName NVARCHAR (50) NULL,
ContactType NVARCHAR (50) NULL,
PRIMARY KEY CLUSTERED (BusinessEntityID ASC))
AS
-- Returns the first name, last name and contact type for the specified contact.
BEGIN
DECLARE @FirstName NVARCHAR(50),
@LastName NVARCHAR(50),
@ContactType NVARCHAR(50);
-- Get common contact information
SELECT @BusinessEntityID = BusinessEntityID,
@FirstName = FirstName,
@LastName = LastName
FROM Person.Person
WHERE BusinessEntityID = @BusinessEntityID;
SET @ContactType = CASE
-- Check for employee
WHEN EXISTS (
SELECT *
FROM HumanResources.Employee AS e
WHERE e.BusinessEntityID = @BusinessEntityID
)
THEN 'Employee'
-- Check for vendor
WHEN EXISTS (
SELECT *
FROM Person.BusinessEntityContact AS bec
WHERE bec.BusinessEntityID = @BusinessEntityID
)
THEN 'Vendor'
-- Check for store
WHEN EXISTS (
SELECT *
FROM Purchasing.Vendor AS v
WHERE v.BusinessEntityID = @BusinessEntityID
)
THEN 'Store Contact'
-- Check for individual consumer
WHEN EXISTS (
SELECT *
FROM Sales.Customer AS c
WHERE c.PersonID = @BusinessEntityID
)
THEN 'Consumer'
END;
-- Return the information to the caller
IF @BusinessEntityID IS NOT NULL
BEGIN
INSERT @retContactInformation
SELECT @BusinessEntityID,
@FirstName,
@LastName,
@ContactType;
END
RETURN;
END
GO
SELECT BusinessEntityID,
FirstName,
LastName,
ContactType
FROM dbo.GetContactInformation(2200);
GO
SELECT BusinessEntityID,
FirstName,
LastName,
ContactType
FROM dbo.GetContactInformation(5);
GO
F. Menggunakan CASE dalam klausa HAVING
Contoh berikut menggunakan ekspresi dalam CASE klausa HAVING untuk membatasi baris yang dikembalikan oleh SELECT pernyataan. Pernyataan mengembalikan tarif per jam untuk setiap jabatan HumanResources.Employee pekerjaan dalam tabel. Klausul ini HAVING membatasi judul untuk mereka yang dipegang oleh karyawan bergaji dengan tingkat gaji maksimum lebih besar dari 40 dolar, atau karyawan nonsalari dengan tingkat pembayaran maksimum lebih besar dari 15 dolar.
USE AdventureWorks2022;
GO
SELECT JobTitle,
MAX(ph1.Rate) AS MaximumRate
FROM HumanResources.Employee AS e
INNER JOIN HumanResources.EmployeePayHistory AS ph1
ON e.BusinessEntityID = ph1.BusinessEntityID
GROUP BY JobTitle
HAVING (
MAX(CASE
WHEN SalariedFlag = 1 THEN ph1.Rate
ELSE NULL
END) > 40.00
OR MAX(CASE
WHEN SalariedFlag = 0 THEN ph1.Rate
ELSE NULL
END) > 15.00
)
ORDER BY MaximumRate DESC;
GO
G. Menggunakan ekspresi CASE berlapis untuk mengategorikan hasil
Contoh berikut menggunakan ekspresi berlapis untuk mengategorikan CASE produk berdasarkan ListPrice. Jika harga daftar produk melebihi 1.000 dolar, harga tersebut dianggap High-end. Produk yang tersisa dikategorikan dalam ekspresi berlapis CASE berdasarkan ProductLine dan ListPrice.
USE AdventureWorks2022;
GO
SELECT
ProductNumber,
Name,
ListPrice,
PriceCategory =
CASE
WHEN ListPrice > 1000 THEN 'High-end'
ELSE
CASE ProductLine
WHEN 'R' THEN
CASE
WHEN ListPrice > 500 THEN 'Premium Road'
ELSE 'Standard Road'
END
WHEN 'M' THEN
CASE
WHEN ListPrice > 500 THEN 'Premium Mountain'
ELSE 'Standard Mountain'
END
WHEN 'T' THEN 'Touring'
ELSE 'Other'
END
END
FROM Production.Product
ORDER BY ListPrice DESC;
Contoh: Azure Synapse Analytics and Analytics Platform System (PDW)
H. Menggunakan pernyataan SELECT dengan ekspresi CASE
SELECT Dalam pernyataan, CASE ekspresi memungkinkan nilai diganti dalam tataan hasil berdasarkan nilai perbandingan. Contoh berikut menggunakan CASE ekspresi untuk mengubah tampilan kategori baris produk agar lebih dapat dimengerti. Saat nilai tidak ada, teks Not for sale ditampilkan.
SELECT ProductAlternateKey,
Category = CASE ProductLine
WHEN 'R' THEN 'Road'
WHEN 'M' THEN 'Mountain'
WHEN 'T' THEN 'Touring'
WHEN 'S' THEN 'Other sale items'
ELSE 'Not for sale'
END,
EnglishProductName
FROM dbo.DimProduct
ORDER BY ProductKey;
GO
1. Menggunakan CASE dalam pernyataan UPDATE
Contoh berikut menggunakan CASE ekspresi dalam UPDATE pernyataan untuk menentukan nilai yang diatur untuk kolom VacationHours untuk karyawan dengan SalariedFlag diatur ke 0. Ketika mengurangi 10 jam dari VacationHours menghasilkan nilai negatif, VacationHours ditingkatkan 40 jam; jika tidak, VacationHours ditingkatkan 20 jam.
UPDATE dbo.DimEmployee
SET VacationHours = (
CASE
WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40
ELSE (VacationHours + 20.00)
END
)
WHERE SalariedFlag = 0;
GO