Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql isnull vs是null_Sql_Sql Server_Sql Server 2005_Tsql - Fatal编程技术网

Sql isnull vs是null

Sql isnull vs是null,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,我注意到工作中有许多查询,因此在表格中使用了限制: isnull(name,'') <> '' 这是遗留问题还是性能问题?isnull(name,”):name是(name为null或name:name)(假设:name从不包含空字符串,因此这样的速记可能不好) 这取决于性能或语句,其中子句的性能可能非常差。但是,列上的函数会影响索引的使用。与往常一样:配置文件。isnull(名称“”)名称 isnull(name,'') <> name 我可以看到他们使用这种方法

我注意到工作中有许多查询,因此在表格中使用了限制:

isnull(name,'') <> ''
这是遗留问题还是性能问题?

isnull(name,”):name
(name为null或name:name)
(假设
:name
从不包含空字符串,因此这样的速记可能不好)

这取决于性能<
中的code>或
语句,其中子句的性能可能非常差。但是,列上的函数会影响索引的使用。与往常一样:配置文件。

isnull(名称“”)名称
isnull(name,'') <> name
我可以看到他们使用这种方法,因为这样,如果名称不匹配或为空,它将作为失败的比较返回。这实际上意味着:
名称为空
名称

其中as this
name not null
只需检查名称是否为null

is not null
将仅检查字段是否不为空。如果该字段包含空字符串,则该字段不再为空

isnull(name, '') <> name
isnull(名称“”)名称
检查空字符串和空字符串

where isnull(name,'') <> ''
这将为您提供所需的执行计划


它们的意思不一样

name is not null 
这将检查名称字段为空的记录

isnull(name,'') <> name  
isnull(名称“”)名称
这个函数将null字段的值更改为空字符串,以便在比较中使用它们。在SQL Server中(但我认为不是在Oracle中),如果一个值为null,并且用于比较等式或不等式,则不会考虑该值,因为null表示我不知道该值,因此不是实际值。因此,如果要确保在进行比较时考虑空记录,则需要使用ISNULL或COALESCE(这是ASCII标准术语,因为ISNULL不适用于所有数据库)

你应该看到的是两者之间的区别

isnull(a.name,'') <> b.name  
isnull(a.name,”)b.name
a、 姓名


然后你就会明白为什么需要ISNULL才能得到正确的结果。

我显然误解了你的问题。所以,让我先给出我的第一个答案,然后试试这个:

isnull(name,'') <> ''
isnull(名称“”)“”
这是一条被误导的捷径

name is not null and name <> ''
名称不为空且名称为“”

如果要使用该列上的索引,请使用

name is not null and name <> '' 
名称不为空且名称为“”

其他人已经指出了功能上的差异。至于性能问题,在Postgres中,我发现——哦,我应该提到Postgres有一个函数“coalesce”,它与在其他一些SQL方言中发现的“isnull”是等价的——但是在Postgres中

where coalesce(foobar,'')=''
明显快于

where foobar is null or foobar=''
而且,它可以非常快地说

 where foobar>''
结束


大于测试可以使用索引,从而跳过所有空格,而不等于测试必须读取完整文件。(假设您在字段上有一个索引,并且没有优先使用其他索引。)

这两个查询不同。例如,我没有中间名,这是一个已知的事实,可以存储为

MiddleName=''
然而,如果我们不知道某人的中间名,我们可以存储NULL。
因此,ISNULL(MiddleName,'')表示“没有已知中间名的人”。

它同时处理空字符串和
NULL
。虽然能够使用一条语句很好,
isnull
是专有语法。我将使用可移植的标准SQL作为

NULLIF(name, '') IS NOT NULL

如果你准确地引用代码,马丁·史密斯是对的。如果它实际上是类似于isnull(name,,)@name的东西,那么您可以阻止SQL使用任何索引,但您得到的结果更像Donniedescribes@Matt:是的,我在示例中给出的代码中犯了一个错误。现在已修复。“使用此模式…效率较低…”模式是使用ISNULL或is NULL…或=construct?@KarlKieninger-模式是使用
ISNULL
-最初有一些执行计划图像使其更清晰。将使它们再生。。
where foobar is null or foobar=''
 where foobar>''
where foobar!=''
MiddleName=''
NULLIF(name, '') IS NOT NULL