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 thisname 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