Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

est nul vs est nul

where isnull(name,'') <> ''

est équivalent à

where name is not null and name <> '' 

qui à son tour est équivalent à

where name <> ''

(si le nom IS NULL cette expression finale serait évaluée comme inconnue et la ligne non renvoyée)

L'utilisation du ISNULL entraînera un scan et est moins efficace comme on peut le voir dans le test ci-dessous.

SELECT ca.[name],
       [number],
       [type],
       [low],
       [high],
       [status]
INTO   TestTable
FROM   [master].[dbo].[spt_values]
       CROSS APPLY (SELECT [name]
                    UNION ALL
                    SELECT ''
                    UNION ALL
                    SELECT NULL) ca 


CREATE NONCLUSTERED INDEX IX_TestTable ON dbo.TestTable(name)

GO


SELECT name FROM TestTable WHERE isnull(name,'') <> ''

SELECT name FROM TestTable WHERE name is not null and name <> ''
/*Can be simplified to just WHERE name <> '' */

Ce qui devrait vous donner le plan d'exécution dont vous avez besoin.