Apakah ada perbedaan yang tidak jelas antara NVL dan Coalesce di Oracle?
Perbedaan yang jelas adalah bahwa penggabungan akan mengembalikan item bukan nol pertama dalam daftar parameternya sedangkan nvl hanya mengambil dua parameter dan mengembalikan yang pertama jika bukan nol, jika tidak mengembalikan yang kedua.
Tampaknya NVL mungkin hanya versi 'Base Case "penggabungan.
Apakah saya melewatkan sesuatu?
Jawaban:
COALESCE
adalah fungsi yang lebih modern yang merupakan bagian dariANSI-92
standar.NVL
adalahOracle
tertentu, itu diperkenalkan di80
's sebelum ada standar apapun.Dalam hal dua nilai, mereka adalah sinonim.
Namun, mereka diimplementasikan secara berbeda.
NVL
selalu mengevaluasi kedua argumen, sementaraCOALESCE
biasanya berhenti evaluasi setiap kali ia menemukan non- pertamaNULL
(ada beberapa pengecualian, seperti urutanNEXTVAL
):Ini berjalan selama hampir
0.5
detik, karena itu menghasilkanSYS_GUID()
, meskipun1
bukanNULL
.Ini mengerti bahwa
1
itu bukan aNULL
dan tidak mengevaluasi argumen kedua.SYS_GUID
Tidak dibuat dan permintaannya instan.sumber
NVL akan melakukan konversi implisit ke tipe data dari parameter pertama, jadi yang berikut ini tidak salah
COALESCE mengharapkan tipe data yang konsisten.
akan melempar 'kesalahan datatype tidak konsisten'
sumber
NVL dan COALESCE digunakan untuk mencapai fungsionalitas yang sama dengan memberikan nilai default jika kolom mengembalikan NULL.
Perbedaannya adalah:
Contoh untuk kasus ketiga. Kasus-kasus lain sederhana.
select nvl('abc',10) from dual;
akan berfungsi karena NVL akan melakukan konversi implisit dari angka 10 ke string.select coalesce('abc',10) from dual;
akan gagal dengan Kesalahan - tipe data tidak konsisten: diharapkan CHAR mendapat NUMBERContoh untuk UNION use-case
gagal dengan
ORA-00932: inconsistent datatypes: expected CHAR got DATE
berhasil.
Informasi lebih lanjut: http://www.plsqlinformation.com/2016/04/difference-between-nvl-and-coalesce-in-oracle.html
sumber
Ada juga perbedaan dalam penanganan rencana.
Oracle dapat membentuk rencana yang dioptimalkan dengan rangkaian filter cabang saat pencarian berisi perbandingan
nvl
hasil dengan kolom yang diindeks.nvl:
bersatu:
Kredit masuk ke http://www.xt-r.com/2012/03/nvl-coalesce-concatenation.html .
sumber
Bukti lain yang menyatu () tidak menghentikan evaluasi dengan nilai non-nol pertama:
Jalankan ini, lalu periksa
my_sequence.currval;
sumber
Sebenarnya saya tidak bisa menyetujui setiap pernyataan.
"COALESCE mengharapkan semua argumen memiliki tipe data yang sama."
Ini salah, lihat di bawah. Argumen dapat berupa tipe data yang berbeda, yang juga didokumentasikan : Jika semua kejadian expr adalah tipe data numerik atau tipe data nonnumerik apa pun yang dapat secara implisit dikonversi ke tipe data numerik, maka Oracle Database menentukan argumen dengan prioritas numerik tertinggi, secara implisit mengonversi argumen yang tersisa ke tipe data itu, dan mengembalikan tipe data itu.. Sebenarnya ini bahkan bertentangan dengan ekspresi umum "COALESCE berhenti pada kemunculan pertama dari nilai non-Null", jika uji kasus No. 4 tidak boleh menimbulkan kesalahan.
Juga menurut uji kasus No. 5
COALESCE
melakukan konversi argumen secara implisit.sumber
Padahal yang ini sudah jelas, dan bahkan disebutkan dengan cara disiapkan oleh Tom yang menanyakan pertanyaan ini. Tapi mari kita pasang lagi.
NVL hanya dapat memiliki 2 argumen. Coalesce mungkin memiliki lebih dari 2.
select nvl('','',1) from dual;
// Hasil::ORA-00909
jumlah argumen tidak validselect coalesce('','','1') from dual;
// Output: mengembalikan 1sumber
NVL: Ganti null dengan nilai.
COALESCE: Kembalikan ekspresi non-nol pertama dari daftar ekspresi.
Tabel: PRICE_LIST
Di bawah ini adalah contoh
[1] Tetapkan harga jual dengan menambahkan laba 10% untuk semua produk.
[2] Jika tidak ada harga daftar pembelian, maka harga jual adalah harga minimum. Untuk penjualan obral.
[3] Jika tidak ada harga minimum juga, maka tetapkan harga jual sebagai harga default "50".
Jelaskan dengan contoh praktis kehidupan nyata.
Anda dapat melihat bahwa dengan NVL kita dapat mencapai aturan [1], [2]
Tetapi dengan COALSECE kita dapat mencapai ketiga aturan tersebut.
sumber
NVL(Purchase_Price + (Purchase_Price * 0.10), nvl(Min_Price,50))
. Atau tentang:nvl(NVL(Purchase_Price + (Purchase_Price * 0.10), Min_Price) ,50)
:)