首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DATALENGTH()或ISNULL()检索非空字段

DATALENGTH()或ISNULL()检索非空字段
EN

Stack Overflow用户
提问于 2013-05-09 15:16:08
回答 7查看 2.4K关注 0票数 0

非常简单,以下哪种方法在WHERE子句中更适合检索记录,其中FIELD_NAMENOT NULL不是空

代码语言:javascript
复制
WHERE DATALENGTH(FIELD_NAME) > 0

代码语言:javascript
复制
WHERE ISNULL(FIELD_NAME, '') <> ''

更新

据我所知,第一种方法对某些类型的字段给出了虚假的结果。同意吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-05-09 15:39:06

首先,

代码语言:javascript
复制
select *
from table
where column <> ''

会给出与

代码语言:javascript
复制
select *
from table
where isnull(column, '') <> ''

因为条件为UNKNOWN而不是FALSE的记录仍将被过滤掉。我一般会同意第一种选择。

DATALENGTH计数尾随空格,而与''的比较则没有。您是否希望' '''相比较取决于您。如果你这样做了,你需要DATALENGTH。如果没有,只需将其与''进行比较。

注意,对于TEXT/NTEXT类型,不支持比较,但DATALENGTH支持。

票数 4
EN

Stack Overflow用户

发布于 2013-05-09 15:18:23

ISNULL是最好的方法而不是DATALENGTH

票数 2
EN

Stack Overflow用户

发布于 2013-05-09 15:55:00

使用AdventureWorks2008 R2数据库进行简短测试:

代码语言:javascript
复制
CREATE INDEX IN_Person_MiddleName_FirstName_LastName
ON Person.Person (MiddleName,FirstName,LastName) ;
GO

SET STATISTICS IO ON;
SET NOCOUNT ON;
GO

PRINT 'Select #1: Full Scan';
SELECT  MiddleName,FirstName,LastName, BusinessEntityID
FROM    Person.Person p;

PRINT 'Select #2: Seek (range scan)';
SELECT  MiddleName,FirstName,LastName, BusinessEntityID
FROM    Person.Person p
WHERE   p.MiddleName <> '' -- p.MiddleName <> '' implies that {p.MiddleName IS NOT NULL} condition to be true

PRINT 'Select #3: Full Scan';
SELECT  MiddleName,FirstName,LastName, BusinessEntityID
FROM    Person.Person p
WHERE   DATALENGTH(p.MiddleName) > 0;

PRINT 'Select #4: Full Scan';
SELECT  MiddleName,FirstName,LastName, BusinessEntityID
FROM    Person.Person p
WHERE   ISNULL(p.MiddleName, '') <> '';

结果:

代码语言:javascript
复制
Select #1: Full Scan
Table 'Person'. Scan count 1, logical reads 105, ...
Select #2: Seek (range scan)
Table 'Person'. Scan count 2, logical reads 67,  ...        <-- minimum logical reads
Select #3: Full Scan
Table 'Person'. Scan count 1, logical reads 105, ...
Select #4: Full Scan
Table 'Person'. Scan count 1, logical reads 105, ...

执行计划:

注1:您可以看到,Select #2 (WHERE p.MiddleName <> '')提供了最好的性能,是Server使用Index Seek (范围扫描)而不是*FULL *Index Scan的唯一情况。这是因为p.MiddleName <> ''是SARG (至少在Server 2008 R2中)。

注2: DATALENGTH( NULL )给出NULL,因此DATALENGTH(FIELD_NAME) > 0条件是错误的。

注3: ISNULL()函数用于表示(SELECT子句),而不是用于编写条件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16465216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档