Masalah:
Anda ingin melakukan pembagian dalam kueri SQL Anda, tetapi penyebutnya adalah ekspresi yang bisa menjadi nol. Basis data akan memberi Anda kesalahan saat penyebut sebenarnya nol.
Contoh:
Basis data kami memiliki tabel bernama investor_data
dengan data pada kolom berikut:id
, investor_year
, price_per_share
, income
, dan expenses
.
id | investor_year | price_per_share | penghasilan | pengeluaran |
---|---|---|---|---|
1 | 2016 | 20 | 3200 | 2300 |
2 | 2017 | 130 | 2000 | 2000 |
3 | 2018 | 40 | 200 | 100 |
4 | 2019 | 15 | 5900 | 4900 |
Mari kita bagi harga per saham dengan selisih antara pendapatan dan pengeluaran untuk menentukan rasio P/E (rasio harga-pendapatan) untuk setiap tahun. Perhatikan bahwa ada kasus ketika pendapatan sama dengan pengeluaran, sehingga perbedaannya akan menjadi nol. Jadi, kita perlu menemukan cara untuk menghindari pembagian dengan nol.
Solusi:
SELECT investor_year, price_per_share/NULLIF(income-expenses, 0) AS P_E_ratio FROM investor data;
Kueri ini mengembalikan rasio P/E untuk setiap tahun seperti yang dijelaskan dalam pernyataan masalah:
investor_year | P_E_ratio |
---|---|
2016 | 0.0222 |
2017 | NULL |
2018 | 0,4000 |
2019 | 0,0150 |
Jika perbedaan antara pendapatan dan pengeluaran adalah nol (seperti yang terjadi pada tahun 2017), NULLIF
fungsi mengubah nol menjadi nilai NULL. Oleh karena itu, pembagian dengan nol memberikan hasil NULL.
Diskusi:
Jika Anda ingin menangani pembagian dengan nol dengan baik, Anda dapat menggunakan NULLIF
fungsi. NULLIF
membutuhkan dua argumen:ekspresi minat, dan nilai yang ingin Anda timpa. Jika argumen pertama sama dengan argumen kedua, maka NULLIF
mengembalikan NULL; jika tidak, ia mengembalikan argumen pertama.
Anda dapat menggunakan fungsi ini untuk menangani pembagian potensial dengan nol dengan membungkus penyebut dalam panggilan ke NULLIF
. Dalam contoh kita, jika perbedaan antara pendapatan dan pengeluaran adalah nol, nilai ini akan diubah menjadi NULL, dan penyebut dalam pembagian akan menjadi NULL, bukan nol.
Solusi 2:Gunakan WHERE
Tentu saja, dalam beberapa situasi, Anda dapat menggunakan solusi yang lebih sederhana:Hindari pembagian dengan nol dengan menggunakan WHERE
dengan operator pembanding <>. Dalam contoh kita, kita dapat memeriksa apakah pendapatan-pengeluaran berbeda dari 0. Jika ya, perhitungan akan dikembalikan.
SELECT investor_year, price_per_share/(income-expenses) AS P_E_ratio FROM investor data WHERE (income-expenses) <> 0 ;
Perhatikan bahwa dengan WHERE
solusi, Anda akan mendapatkan lebih sedikit baris daripada yang ada di investor_date
meja. Baris di mana pendapatan dan pengeluaran sama tidak akan ditampilkan di hasil akhir.