此查询中 IsNull 的用途是啥?

Posted

技术标签:

【中文标题】此查询中 IsNull 的用途是啥?【英文标题】:What is the Purpose of the IsNull in this query?此查询中 IsNull 的用途是什么? 【发布时间】:2020-03-10 12:28:38 【问题描述】:

我有一个桌面应用程序,我正在将其转换为 Web,但我无法理解查询的 IsNull 部分的用途。该查询是针对 SQL 女士的,我知道它有一个 IsNull 函数,但事实并非如此。所以我对它的目的感到困惑。以下是我的查询:

UPDATE tb_category
SET 
Email = @Email, 
CandidateID = @CandidateID, 
Code = @Code, 
TestDate = @TestDate, 
Description = @Description, 
PointsEarned = @PointsEarned, 
PointsAvailable = @PointsAvailable, 
Average25th = @Average25th, 
Average75th = @Average75th, 
ImportedDate = @ImportedDate, 
CreationDate = @CreationDate, 
TestNum = @TestNum, 
CategoryNum = @CategoryNum 
WHERE ((Email = @Original_Email) 
AND (CandidateID = @Original_CandidateID) 
AND (Code = @Original_Code) 
AND (TestDate = @Original_TestDate) 
AND ((@IsNull_Description = 1 AND Description IS NULL) OR (Description = @Original_Description)) 
AND (PointsEarned = @Original_PointsEarned) 
AND ((@IsNull_PointsAvailable = 1 AND PointsAvailable IS NULL) OR (PointsAvailable = 
@Original_PointsAvailable)) 
AND ((@IsNull_Average25th = 1 AND Average25th IS NULL) OR (Average25th = @Original_Average25th)) 
AND ((@IsNull_Average75th = 1 AND Average75th IS NULL) OR (Average75th = @Original_Average75th)) 
AND ((@IsNull_ImportedDate = 1 AND ImportedDate IS NULL) OR (ImportedDate = @Original_ImportedDate)) 
AND ((@IsNull_CreationDate = 1 AND CreationDate IS NULL) OR (CreationDate = @Original_CreationDate)) 
AND (TestNum = @Original_TestNum) 
AND (CategoryNum = @Original_CategoryNum));

我尝试通过删除 IsNull 部分来简化更新语句,但这不起作用。

【问题讨论】:

【参考方案1】:

在 SQL 中,null 不等于 (=) 任何东西——甚至不等于另一个 null,因此在查询中如果两个值都为 null(旧的和新的),您需要考虑到这一点并使用 IS 检查值空。

【讨论】:

这很烦人。谢谢。【参考方案2】:

我看到这种模式在 WHERE 子句中重复了多次:

@IsNull_Description = 1 AND Description IS NULL

这意味着一个变量@IsNull_SomeColumnName,大概是在代码前面设置的,其值为1,该变量所关联的列当前为NULL

函数IsNull(Param1, Param2)用于如果第一个参数IS NULL,则用第二个参数的值代替第一个参数的值,函数返回Param2的值。

在 SQL Server 和许多其他 RDBMS 中,IS NULL 语法用于检查值当前是否为 NULL。在这里,Description IS NULL 将返回 TRUE,如果 Description 为 null,则返回 FALSE,如果不是。

【讨论】:

以上是关于此查询中 IsNull 的用途是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何优化此查询(或内部 AND 验证)?

删除此 ISNULL 语句是不是有任何潜在问题?

AttributeError:类型对象'Categories'在Django中没有属性'user_id__isnull'

如果我们传递空值,Sql 查询 ISNULL(@parameter,ColumnName) 返回啥?

ISNULL 如何影响查询性能

函数EMPTY(0)和ISNULL(0)的返回值分别是啥