COALESCE en ISNULL vergelijken
De ISNULL-functie en de COALESCE-expressie hebben een soortgelijk doel, maar kunnen zich anders gedragen.
- Omdat ISNULL een functie is, wordt deze slechts één keer geëvalueerd. Zoals hierboven beschreven, kunnen de invoerwaarden voor de COALESCE-expressie meerdere keren worden geëvalueerd.
- De bepaling van het gegevenstype van de resulterende expressie is anders. ISNULL gebruikt het gegevenstype van de eerste parameter, COALESCEvolgt de CASE-expressieregels en retourneert het gegevenstype met de hoogste prioriteit.
- De NULL-mogelijkheid van de resultaatexpressie is anders voor ISNULL en COALESCE. De geretourneerde ISNULL-waarde wordt altijd beschouwd als NIET NULL-geschikt (ervan uitgaande dat de geretourneerde waarde een waarde zonder nul is), terwijl COALESCE met niet-null-parameters wordt beschouwd als NULL. Dus de uitdrukkingen ISNULL(NULL, 1) enCOALESCE(NULL, 1), hoewel equivalent, hebben verschillende nullabiliteitswaarden. Dit maakt een verschil als u deze uitdrukkingen in berekende kolommen gebruikt, sleutelbeperkingen maakt of de geretourneerde waarde van een scalaire UDF-deterministisch maakt, zodat deze kan worden geïndexeerd zoals in het volgende voorbeeld wordt getoond.
> USE tempdb;
> GO
> -- This statement fails because the PRIMARY KEY cannot accept NULL values
> -- and the nullability of the COALESCE expression for col2
> -- evaluates to NULL.
> CREATE TABLE #Demo ( col1 integer NULL, col2 AS COALESCE(col1, 0) PRIMARY KEY, col3 AS ISNULL(col1, 0) );
>
> -- This statement succeeds because the nullability of the
> -- ISNULL function evaluates AS NOT NULL.
>
> CREATE TABLE #Demo ( col1 integer NULL, col2 AS COALESCE(col1, 0),
> col3 AS ISNULL(col1, 0) PRIMARY KEY );
Validaties voor ISNULL en COALESCE zijn ook verschillend. Een NULL-waarde voor ISNULL wordt bijvoorbeeld geconverteerd naar int, terwijl u voor COALESCE een gegevenstype moet opgeven.ISNULL gebruikt slechts 2 parameters, terwijl COALESCE een variabel aantal parameters nodig heeft.
Bron:BOL