首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WHERE (ISNULL(列名,0) > 0)与WHERE (columnName不为NULL)和(columnName >0)

WHERE (ISNULL(列名,0) > 0)与WHERE (columnName不为NULL)和(columnName >0)
EN

Stack Overflow用户
提问于 2011-12-16 21:43:31
回答 3查看 3K关注 0票数 2
代码语言:javascript
复制
SELECT * FROM tableName WHERE (ISNULL(columnName,0) > 0)

代码语言:javascript
复制
SELECT * FROM tableName WHERE (columnName IS NOT NULL) AND (columnName > 0)

哪一个更好?

columnName具有int数据类型

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-16 21:50:00

您不需要在查询中检查null值,所以我想这样会更好。

代码语言:javascript
复制
SELECT * FROM tableName WHERE columnName > 0
票数 7
EN

Stack Overflow用户

发布于 2011-12-16 21:50:25

为什么不只是WHERE columnName > 0呢?条件的其余部分似乎是多余的:不会返回空值。

票数 3
EN

Stack Overflow用户

发布于 2011-12-16 21:50:03

如何做得更好?

我认为后者更具可读性,其他人可能不同意。你可能有一种倾向于前者的房子风格,在这种情况下,这是毫无疑问的。

至于性能,我非常怀疑是不是导致了性能问题,所以你不应该优化,过早优化是万恶之源。

这是一个很好的问题,询问When is optimisation premature?here是该术语的定义。

在这种情况下,性能大致按以下顺序提高:

代码语言:javascript
复制
SELECT Count(*) FROM BigTable WHERE (ISNULL(SmallNumber,0) > 0) --140 ms
SELECT Count(*) FROM BigTable WHERE (SmallNumber IS NOT NULL) AND (SmallNumber > 0) --41 ms
SELECT Count(*) FROM BigTable WHERE SmallNumber > 0 --30 ms

但是将Count(*)*互换,任何微小的性能提升都会在检索行的过程中丢失。

在使用这个丑陋的代码块创建一个大表之后,您可以自己测试它。

代码语言:javascript
复制
CREATE TABLE [dbo].[BigTable]( [ID] [int] IDENTITY(1,1) NOT NULL, [BigNumber] [bigint] NULL, [SmallNumber] [int] NULL,
    CONSTRAINT [PK_BigTable] PRIMARY KEY CLUSTERED ( [ID] ASC ));
CREATE NONCLUSTERED INDEX [IX_BigTable] ON [dbo].[BigTable] ([SmallNumber] ASC);
With Digits as ( SELECT 0 AS d UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 
    UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9),
OneToAMillion as (SELECT (100000 * D6.d) + (10000 * D5.d) + (1000 * D4.d) + (100 * D3.d) + (10 * D2.d) + (1 * D1.d) AS Number
    FROM Digits D6, Digits D5, Digits D4, Digits D3, Digits D2, Digits D1)
INSERT INTO dbo.BigTable (BigNumber, SmallNumber) SELECT CAST(CHECKSUM(NEWID()) as BigInt) * CHECKSUM(NEWID()), CHECKSUM(NEWID()) FROM OneToAMillion;
UPDATE BigTable SET SmallNumber = Null WHERE BigNumber < 0;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8535032

复制
相关文章

相似问题

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