Ini adalah pertanyaan yang bagus, dan pertanyaan yang tidak memiliki jawaban yang bagus. Perawatan NULL
dalam dua contoh Anda berbeda.
Masalah mendasar adalah apa NULL
cara. Biasanya, ini digunakan untuk menunjukkan hilang nilai-nilai. Namun, dalam standar ANSI, ini adalah singkatan dari tidak diketahui nilai. Saya yakin para filsuf dapat mencurahkan buku-buku tebal untuk membedakan antara "hilang" dan "tidak diketahui".
Dalam ekspresi sederhana (boolean atau aritmatika atau skalar dari jenis lain), ANSI mendefinisikan hasil "tidak diketahui" di hampir semua kasus di mana salah satu operan "tidak diketahui". Ada beberapa pengecualian:NULL AND FALSE
salah dan NULL IS NULL
benar, tapi ini jarang terjadi.
Untuk operasi agregasi, pikirkan SUM()
sebagai "jumlahkan semua nilai yang diketahui", dan seterusnya. SUM()
memperlakukan NULL
nilai yang berbeda dari +
. Namun, perilaku ini juga standar, jadi begitulah cara kerja semua basis data.
Jika Anda menginginkan NULL
nilai untuk agregasi ketika apa saja operandnya adalah NULL
, maka Anda perlu menggunakan CASE
. Saya pikir cara termudah untuk satu kolom adalah:
(CASE WHEN COUNT(col) = COUNT(*) THEN SUM(COL) END)