Masalah:
Anda ingin menghindari kesalahan pembagian dengan nol.
Contoh:
Basis data kami memiliki tabel bernama numbers dengan data pada kolom id , number_a , dan number_b .
| id | nomor_a | nomor_b |
|---|---|---|
| 1 | 4 | 0 |
| 2 | 57 | -5 |
| 3 | -7 | 56 |
| 4 | -67 | 0 |
| 5 | 23 | 55 |
| 6 | -8 | -4 |
Mari kita bagi number_a dengan number_b dan tampilkan tabel dengan kolom baru, divided , dengan hasil pembagian.
Solusi 1:
SELECT *, number_a / NULLIF(number_b, 0) AS divided FROM numbers;
Solusi 2:
SELECT *, CASE WHEN number_b = 0 THEN NULL ELSE number_a / number_b END AS divided FROM numbers;
Hasilnya adalah:
| id | nomor_a | nomor_b | dibagi |
|---|---|---|---|
| 1 | 4 | 0 | NULL |
| 2 | 57 | -5 | -11.4000 |
| 3 | -7 | 56 | -0.1250 |
| 4 | -67 | 0 | NULL |
| 5 | 23 | 55 | 0,4182 |
| 6 | -8 | -4 | 2.000 |
Solusi 3:
SELECT *, number_a / number_b AS divided FROM numbers WHERE number_b != 0;
Hasilnya adalah:
| id | nomor_a | nomor_b | dibagi |
|---|---|---|---|
| 2 | 57 | -5 | -11.4000 |
| 3 | -7 | 56 | -0.1250 |
| 5 | 23 | 55 | 0,4182 |
| 6 | -8 | -4 | 2.000 |
Diskusi:
Solusi pertama menggunakan NULLIF() fungsi, yang mengambil dua angka sebagai argumen. Ketika argumen pertama sama dengan argumen lainnya, fungsi mengembalikan NULL hasil dari. Jika number_b sama dengan nol, pembaginya adalah NULL , dan hasil pembagiannya adalah NULL .
Solusi kedua menggunakan CASE penyataan. Jika kondisi setelah WHEN kata kunci benar (dalam kasus kami, kondisinya adalah number_b = 0 ), kami menentukan bahwa NULL dikembalikan. Jika tidak, pembagian terjadi seperti biasa.
Solusi ketiga cukup menggunakan WHERE kondisi untuk menyaring baris di mana number_b adalah nol. Baris dengan number_b sama dengan nol hilang dari kumpulan hasil.