Ungkapan CASE
Logik IF/THEN di dalam pertanyaan.
Ungkapan CASE ialah pelajaran SQL Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran SQL Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.
Logik Percabangan dalam SQL
Adakalanya anda memerlukan pertanyaan untuk membuat keputusan: jika ini, maka itu, jika tidak, perkara lain. SQL menyediakan ungkapan CASE khusus untuk tujuan ini.
CASE membolehkan anda mengembalikan nilai yang berbeza berdasarkan syarat, terus dalam SELECT. Anggap ia sebagai versi SQL bagi rangkaian if/else.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
ELSE 'affordable'
END AS price_band
FROM products;Struktur CASE
Ungkapan CASE mempunyai beberapa bahagian:
WHEN condition THEN value— satu atau lebih cabangELSE value— nilai sandaran pilihanEND— menutup ungkapan (wajib!)
SQL menilai cabang WHEN dari atas ke bawah dan mengembalikan nilai cabang pertama yang benar.
CASE WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result
ENDCASE Mengembalikan Nilai
Idea utamanya: ungkapan CASE menilai kepada satu nilai bagi setiap baris. Oleh sebab ia menghasilkan nilai, anda boleh menggunakannya di mana-mana tempat yang menerima nilai — dalam senarai SELECT, dalam WHERE, dalam ORDER BY, malah di dalam fungsi.
Di sini, ia melabelkan setiap pesanan dengan status yang ringkas.
SELECT order_id,
CASE WHEN shipped_at IS NOT NULL THEN 'shipped'
WHEN paid_at IS NOT NULL THEN 'paid'
ELSE 'pending'
END AS status
FROM orders;Padanan Pertama Diutamakan
Urutan penting. SQL menyemak setiap WHEN mengikut turutan dan berhenti pada cabang benar yang pertama. Cabang seterusnya diabaikan walaupun cabang itu juga sepadan.
Di bawah, pesanan melebihi 1000 ialah 'besar', bukan 'sederhana', kerana cabang yang sepadan dahulu diutamakan.
SELECT order_id, total,
CASE WHEN total >= 1000 THEN 'large'
WHEN total >= 100 THEN 'medium'
ELSE 'small'
END AS size_band
FROM orders;Cabang ELSE
Cabang ELSE merangkumi semua keadaan. Jika tiada syarat WHEN yang benar, CASE mengembalikan nilai ELSE.
Jika anda meninggalkan ELSE dan tiada apa-apa yang sepadan, CASE mengembalikan NULL. Ini ialah punca biasa NULL yang tidak dijangka, jadi tambahkan ELSE yang jelas apabila anda mahukan nilai sandaran yang ditetapkan.
SELECT name,
CASE WHEN stock = 0 THEN 'out of stock' END AS note
FROM products;
-- rows with stock > 0 get NULL in note (no ELSE)Syarat Boleh Jadi Apa-apa
Syarat WHEN hanyalah ungkapan logik — jenis yang sama seperti yang anda tulis dalam klausa WHERE. Anda boleh menggunakan perbandingan, AND, OR, BETWEEN, IN, LIKE dan sebagainya.
SELECT email,
CASE WHEN country IN ('US','CA') AND age >= 18 THEN 'eligible'
WHEN email LIKE '%@test.com' THEN 'test account'
ELSE 'review'
END AS segment
FROM users;Jenis Hasil Mestilah Serasi
Setiap cabang CASE mestilah mengembalikan nilai daripada jenis yang serasi, kerana lajur perlu mempunyai satu jenis. Mencampurkan teks dan nombor akan menyebabkan ralat atau penukaran jenis yang tidak dijangka.
Jika anda memerlukan nombor dalam satu cabang dan teks dalam cabang yang lain, tukar jenis secara jelas supaya jenisnya sepadan.
SELECT product_id,
CASE WHEN on_sale THEN price * 0.9
ELSE price
END AS effective_price -- all branches numeric: good
FROM products;Menggunakan CASE dalam WHERE
Oleh sebab CASE menghasilkan nilai, anda boleh membandingkan hasilnya dalam klausa WHERE. Ini berguna untuk peraturan penapisan dinamik.
Namun, selalunya logik syarat biasa dalam WHERE lebih jelas — gunakan CASE dalam WHERE hanya apabila percabangan itu benar-benar memudahkan syarat.
SELECT *
FROM orders
WHERE CASE WHEN priority = 'high' THEN total > 0
ELSE total > 500
END;CASE Bersarang
Anda boleh meletakkan CASE di dalam cabang CASE yang lain untuk menyatakan logik berlapis. Cara ini berfungsi, tetapi ungkapan yang bersarang terlalu dalam sukar dibaca.
Pastikan sarangannya tidak terlalu dalam; jika menjadi panjang, lajur berasingan atau jadual carian biasanya lebih kemas.
SELECT order_id,
CASE WHEN region = 'EU' THEN
CASE WHEN total > 100 THEN 'EU big'
ELSE 'EU small' END
ELSE 'other'
END AS bucket
FROM orders;CASE dengan Agregat
Satu corak yang berkuasa ialah membalut CASE di dalam agregat seperti SUM atau COUNT. Cara ini mengira atau menjumlahkan baris secara bersyarat dalam satu laluan sahaja — kadangkala disebut pengagregatan bersyarat atau jadual pangsi.
SELECT
COUNT(*) AS total_orders,
SUM(CASE WHEN status = 'shipped' THEN 1 ELSE 0 END) AS shipped,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending
FROM orders;CASE Mengembalikan NULL dengan Sengaja
Mengembalikan NULL daripada sesuatu cabang kadangkala memang perkara yang diperlukan — contohnya untuk mengosongkan nilai yang tidak mahu dipaparkan, atau memberikannya kepada agregat kemudian yang mengabaikan NULL.
Di sini, hanya pesanan besar mengekalkan jumlahnya; yang lain menjadi NULL supaya AVG melangkaunya.
SELECT order_id,
CASE WHEN total >= 1000 THEN total
ELSE NULL
END AS large_order_total
FROM orders;Semakan Pantas
Pertimbangkan ungkapan ini untuk baris dengan total = 1500:
CASE WHEN total >= 100 THEN 'medium' WHEN total >= 1000 THEN 'large' ELSE 'small' END
Apakah nilai yang dipulangkannya?
Imbas Kembali: Ungkapan CASE
Anda telah mempelajari asas logik bersyarat dalam SQL:
CASE WHEN ... THEN ... ELSE ... ENDmengembalikan satu nilai bagi setiap baris- Cabang diperiksa dari atas ke bawah; padanan pertama dipilih
- Jika
ELSEditinggalkan,NULLterhasil apabila tiada padanan - Semua cabang mesti mengembalikan jenis yang serasi
CASEboleh digunakan dalamSELECT,WHEREdan dalam fungsi agregat
Seterusnya, kita akan membandingkan dua bentuk sintaks CASE.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
WHEN price > 20 THEN 'mid'
ELSE 'cheap'
END AS tier
FROM products;Pelajari SQL dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 46
- Pelajaran
- 183
Soalan Lazim
Adakah pelajaran “Ungkapan CASE” percuma?
Ya — teks penuh “Ungkapan CASE” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus SQL Academy, tingkat taraf kepada CoddyKit PRO. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Ungkapan CASE”?
Logik IF/THEN di dalam pertanyaan. Anda berlatih SQL Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan SQL Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran SQL Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “Ungkapan CASE” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran SQL Academy ini?
Ya. Setiap pelajaran SQL Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Ungkapan CASE
- CASE Carian berbanding CASE Ringkas
- Mengumpulkan dan Melabel Data
- CASE dalam ORDER BY dan Agregat