Εξαρτάται τί προσπαθείς να κάνεις. Και οι δύο λύσεις είναι καλές για διαφορετικές χρήσεις.
Η COALESCE σου επιτρέπει να επιστρέψεις μια δικιά σου τιμή όταν το πεδίο που ελέγχεις είναι NULL. Αυτό είναι πολύ χρήσιμο σε ένα SELECT για να επιστρέψεις μια default τιμή όταν το πεδίο που επιστρέφεις περιέχει NULLs:
SELECT CustomerName, ISNULL(Address, 'Unknown Address') From Customer
Η ISNULLχρειάζεται προσοχή όμως όταν τη χρησιμοποιείς στο WHERE. Αν την εφαρμόσεις επάνω στο πεδίο που θέλεις να ψάξεις, η βάση δεν θα μπορέσει να εκμεταλλευτεί τα indexes που περιλαμβάνουν το συγκεκριμένο πεδίο. Αν, για παράδειγμα, γράψεις:
SELECT CustomerName FROM Customer WHERE ISNULL(City,'Unknown City')=@CityParam AND Country=@CountryParam
η βάση θα πιάσει μία-μία τις εγγραφές που έχουν Country=@CountryParam και θα κάνει τον έλεγχο ISNULL(City,'Unknown City')=@CityParam . Άουτς!
Αντί για την COALESCE σε αυτή την περίπτωση θα ήταν καλύτερο να γράψεις
SELECT CustomerName FROM Customer WHERE (City=@CityParam OR (City IS NULL AND @CityParam IS NULL)) AND Country=@CountryParam
Ο λόγος για τον διπλό έλεγχο των NULL είναι ότι ένα NULL ΔΕΝ είναι ποτέ ίσο με NULL! Αυτό είναι μία από τις παραξενιές της SQL, όχι μόνο του SQL Server. Οποιαδήποτε σύγκριση γίνεται με NULL πρέπει να επιστρέφει NULL!
Η CASE WHEN ... είναι μία άλλη επιλογή που σου επιτρέπει να κάνεις πολύ περισσότερα πράγματα. Το πρώτο statement θα μπορούσε να γραφτεί ως εξής:
SELECT CustomerName, CASE
WHEN Address IS NULL THEN 'Unknown Address'
ELSE Address
END CASE
FROM Customer
Αρχικά φαίνεται ότι γράφεις πολύ περισσότερο κώδικα από πριν. Από την άλλη, μπορείς να προσθέσεις πολλούς ελέγχους στο WHEN, όχι μόνο τον έλεγχο για NULL. Θα μπορούσες π.χ. να ελέγχεις περισσότερα από ένα πεδία για NULL και να επιστρέφεις κάποιο συνδυασμό τους.
Η COALESCE συμπεριφέρεται περίπου όπως η ISNULL, με τη διαφορά ότι δέχεται σαν παραμέτρους πολλά πεδία και επιστρέφει το πρώτο από αυτά που περιέχει τιμή.
Resources τώρα. Η πρώτη πηγή σου θα πρέπει να είναι το documentation του SQL Server. Έχει πολύ καλεί δομή και αναλυτικές περιγραφές. Αν θέλεις κάτι στα γρήγορα, υπάρχει και το http://www.sqlserverdirectory.com/sqlserver_articles.htm . Ίσως να σε ενδιαφέρει και το "How to share data between stored procedures" του Erland Sommarskog. Άλλο φοβερό blog είναι της Kimberly Tripp, "Improving *my* SQL skills through your questions". Η Tripp είναι μια από τις καλύτερες πηγές για θέματα SQL Server γενικά, και πολύ καλή ομιλήτρια! Άλλη καλή πηγή είναι ο Itzik Ben-Gan, ο οποίος γράφει κάθε μήνα και στο SQL Server Magazine. Το οποίο είναι επίσης μια πολύ καλή πηγή. Είναι μάλιστα ένα από τα ελάχιστα επαγγελματικά περιοδικά που φέρνει ακόμα ο Παπασωτηρίου, οπότε μπορείς να το προμηθευτείς εύκολα.
Τέλος υπάρχει και το SQL Server Worldwide Users Group το οποίο έχει άπειρα άρθρα και forums για SQL Server, Oracle, DB2, MySQL. Όλως "τυχαίως" εκεί θα βρεις και όσους ανέφερα παραπάνω.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos