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

Ekspresi KASUS SQL Server

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 masih NULL , 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 dalam Dinner 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 dalam Dinner 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 menyebutnya CASE 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, dan CASE ekspresi, dan memiliki sintaks yang sedikit berbeda untuk masing-masing. MySQL membedakan antara CASE pernyataan dan CASE operator, yang pada dasarnya sama dengan CASE ekspresi.


  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 mengubah bahasa default untuk SQL Server?

  2. WinRT System.Data - Hubungkan ke SQL

  3. FILE_ID() vs FILE_IDEX() di SQL Server:Apa Bedanya?

  4. Menggabungkan Nilai Kolom menjadi Daftar yang Dipisahkan Koma

  5. t-sql pilih dapatkan semua Bulan dalam rentang tahun