gpt4 book ai didi

sql - 没有 ISNULL 的条件很臭吗?

转载 作者:行者123 更新时间:2023-12-02 23:33:40 25 4
gpt4 key购买 nike

我看到一篇文章描述了 SQL 代码可能不正确的不同情况。然而,有一个point这让我感到惊讶。他们声称

it is wise to explicitly handle NULLs in nullable columns, by using COALESCE to provide a default value

还提到了

ISNULL。他们还引用了这个 MSDN web page举一个 ISNULL 的例子。这里的基本思想是最好使用

SELECT COUNT(*) FROM [dbo].[Table1] WHERE ISNULL([c2],0) > 2;

然后

SELECT COUNT(*) FROM [dbo].[Table1] WHERE [c2] > 2;

但是,第一个变体不会是 SARG,而结果根本不受 ISNULL 的影响。我理解需要在输出中使用 ISNULLCOALESCE 处理 NULL,但是,我总是尝试使用 IS NULL code> 或 IS NOT NULL 来处理谓词中的 NULL。我错过了什么吗? MSDN 问题的重点是什么?

编辑:为了对讨论使用react,主要是对此 post我准备了一个简单的测试

 IF OBJECT_ID('dbo.LogTable', 'U') IS NOT NULL  DROP TABLE dbo.LogTable

SELECT TOP 100000 DATEADD(day, ( ABS(CHECKSUM(NEWID())) % 65530 ), 0) datesent ,
CASE WHEN ( ABS(CHECKSUM(NEWID())) % 100 ) = 1 THEN NULL ELSE ( ABS(CHECKSUM(NEWID())) % 1000 ) END ivalue
INTO [LogTable]
FROM sys.sysobjects
CROSS JOIN sys.all_columns

CREATE INDEX ix_logtable_ivalue ON LogTable(ivalue asc) INCLUDE(datesent);

-- Q1
select * from logtable where isnull(ivalue, 0) > 998

-- Q2
select * from logtable where ivalue > 998

但是,Q1 中的 ivalue 不是 SARG。有什么陷阱吗?我应该如何为这个特定的数据和查询创建属性 SARG?

最佳答案

您提供的示例中的 isnull 检查毫无意义。 null > 2 返回 null,它不是“true”,因此这些行无论如何都会从查询中排除。首先,以这种方式使用 isnull 将禁止优化器使用 c2 上的索引(如果有的话)。

简而言之 - 这听起来是个糟糕的建议。

关于sql - 没有 ISNULL 的条件很臭吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46563146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com