Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

isnull vs è nullo

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

è equivalente a

where name is not null and name <> '' 

che a sua volta equivale a

where name <> ''

(se il nome IS NULL quell'espressione finale risulterebbe sconosciuta e la riga non restituita)

L'uso di ISNULL pattern risulterà in una scansione ed è meno efficiente come si può vedere nel test seguente.

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 <> '' */

Che dovrebbe darti il ​​piano di esecuzione di cui hai bisogno.