LNNVL adalah fungsi bawaan oracle yang mengembalikan TRUE untuk kondisi yang mengevaluasi ke FALSE atau UNKNOWN, dan mengembalikan FALSE untuk kondisi yang mengevaluasi ke TRUE. Pertanyaan saya adalah apa untungnya mengembalikan kebalikan dari kondisi kebenaran daripada hanya menangani nilai-nilai NULL?
Misalnya, anggap Anda memiliki tabel Emp dengan kolom StartCommission dan CurrentCommission yang mungkin berisi nol. Berikut ini hanya baris yang tidak memiliki nilai nol:
SELECT * FROM Emp WHERE StartCommission = CurrentCommission;
Jika Anda ingin memasukkan baris di mana salah satu komisi nol, Anda bisa melakukan sesuatu seperti ini:
SELECT * FROM Emp WHERE StartCommission = CurrentCommission
OR StartCommission IS NULL OR CurrentCommission IS NULL;
Tampaknya ada fungsi untuk mempersingkat sintaks ini, tetapi menggunakan LNNVL mengembalikan semua catatan yang tidak sama dan semua catatan dengan nol.
SELECT * FROM Emp WHERE LNNVL(StartCommission = CurrentCommission);
Menambahkan TIDAK ke ini hanya mengembalikan baris tanpa nol. Tampak bagi saya bahwa fungsi yang diinginkan untuk kasus ini adalah untuk menjaga kondisi true true, kondisi false salah, dan kondisi yang tidak diketahui mengevaluasi ke true. Apakah saya benar-benar membuat kasus penggunaan rendah di sini? Apakah benar-benar lebih mungkin ingin mengubah yang tidak diketahui menjadi benar, benar menjadi salah, dan salah menjadi benar?
create table emp (StartCommission Number(3,2), CurrentCommission Number(3,2));
insert into emp values (null,null);
insert into emp values (null,.1);
insert into emp values (.2,null);
insert into emp values (.3,.4);
sumber
Jawaban:
Ini adalah fungsi yang aneh dengan sejarah yang aneh - tapi begitu juga nvl2 aneh.
lnnvl
pada dasarnya adalahis not true
operator - tidak diragukan lagi itu dapat digunakan dengan baik sepertinvl2
kaleng, tetapi ketika Anda harus melihat fungsi setiap kali Anda menggunakannya untuk mengingatkan Anda apa yang dilakukannya, Anda bertanya-tanya apakah yang terbaik adalah tetap berpegang padanvl
,coalesce
,decode
dannullif
bersama dengancase
ekspresi, yang lebih intuitifsumber
nullif
sampai saya menyadari itu bisa sangat membantu membuat 'pembagian dengan nol' = nol. Apakah Anda benar-benar menemukan nvl2 (a, c, b) jauh lebih baik daripada decode (a, null, b, c)?Begini, saya belum pernah menggunakan LNNVL dalam beberapa tahun saya menjadi DBA dan PL / SQL Programmer. Saya telah menggunakan NVL2 pada kesempatan (dan selalu harus mencari sisi mana yang benar, dan sisi mana yang tidak). Pada titik itu, tampaknya lebih baik dari perspektif keterbacaan untuk akhirnya menggunakan NVL, DECODE, KASUS, dll.,
Atau, ini berfungsi, dengan asumsi orang memiliki pegangan yang baik tentang bagaimana Oracle menangani NULL dan aritmatika, tetapi pada titik ini, orang mungkin juga menggunakan permintaan asli Anda untuk keterbacaan (dan rencana pelaksanaan mungkin juga mendapat pukulan lebih keras):
sumber
StartCommission<>CurrentCommission OR StartCommission + CurrentCommission IS NULL
?lnnvl
.