isnull vs为null

tga*_*ews 20 sql t-sql sql-server sql-server-2005

我注意到在工作和SO上的一些查询正在使用表单中的限制:

isnull(name,'') <> ''
Run Code Online (Sandbox Code Playgroud)

有没有特别的原因让人们这样做,而不是更简洁

name is not null
Run Code Online (Sandbox Code Playgroud)

这是遗留问题还是性能问题?

Mar*_*ith 37

where isnull(name,'') <> ''
Run Code Online (Sandbox Code Playgroud)

相当于

where name is not null and name <> '' 
Run Code Online (Sandbox Code Playgroud)

而这相当于

where name <> ''
Run Code Online (Sandbox Code Playgroud)

(如果IS NULL最终表达式的名称将评估为未知且未返回行)

使用该ISNULL模式将导致扫描并且效率较低,如以下测试中所示.

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 <> '' */
Run Code Online (Sandbox Code Playgroud)

哪个应该为您提供所需的执行计划.

在此输入图像描述


Jus*_*ner 14

is not null
Run Code Online (Sandbox Code Playgroud)

仅检查字段是否为空.如果该字段包含空字符串,则该字段不再为空.

isnull(name, '') <> name
Run Code Online (Sandbox Code Playgroud)

检查空字符串和空字符串.