Seperti yang ditunjukkan oleh Mark, Anda akan kesulitan menemukan perbedaan kinerja; Saya pikir faktor lain akan lebih penting. Bagi saya, saya selalu menggunakan COALESCE, dan sebagian besar sudah disebutkan oleh Anda atau Tandai:
- COALESCE adalah standar ANSI. Satu hal yang kurang perlu saya khawatirkan jika saya akan mem-porting kode saya. Bagi saya pribadi ini tidak begitu penting, karena saya tahu betapa jarang port seperti itu benar-benar terjadi di luar dunia kelas Celko, tetapi bagi sebagian orang ini adalah keuntungan.
- Berlawanan dengan apa yang Anda katakan tentang keterbacaan, saya merasa bisa lebih sulit untuk membaca ISNULL terutama untuk pengguna yang berasal dari bahasa lain atau platform di mana ISNULL mengembalikan boolean (yang tidak ada dalam SQL Server). Memang, COALESCE lebih sulit dieja, tetapi setidaknya itu tidak mengarah pada asumsi yang salah.
- COALESCE jauh lebih fleksibel, seperti yang bisa saya katakan COALESCE (a, b, c, d) sedangkan dengan ISNULL saya harus melakukan banyak bersarang untuk mencapai hal yang sama.
Anda juga harus yakin mengetahui bagaimana presedensi tipe data ditangani menggunakan dua fungsi jika Anda menggunakannya dengan tipe data yang berbeda / precision dll.
Catatan
Ada satu pengecualian. Ini ditangani secara berbeda dalam versi SQL Server saat ini:
SELECT COALESCE((SELECT some_aggregate_query),0);
SELECT ISNULL((SELECT some_aggregate_query),0);
The COALESCE
varian benar-benar akan mengeksekusi some_aggregate_query
dua kali (sekali untuk memeriksa nilai, dan sekali untuk kembali ketika non-nol), sementara ISNULL
hanya akan mengeksekusi subquery sekali. Saya berbicara tentang beberapa perbedaan lain di sini:
COALESCE
dievaluasi dua kali.