帮酷LOGO
0 0 评论
文章标签:NULL  NUL  Server  


什么是空的?

在数据库中,常见的问题是如何表示丢失的值。 在 SQL Server 中,这是用 NULL。 它用来表示 missingunknown 或者值。 关键字 NULL 用于指示这些值。 在引用 NULL 值时,大多数时候我们调用"。NULL 值"。 NULL 实际上不是一个特定值,一个非存在值,不是零值或者不是空字符串值。 两个 NULL 值不相等。

NULL 表示数据值是否不存在的设置。 数据库引擎使用特殊位图来跟踪行中哪些列是 NULL,哪些列不是。 位图包含每个列的位,如果列为 NULL.,则位设置为 1

例如下面的SELECT 语句从 BookDetails 表返回数据。

SELECT BookId, Title, ReleaseDate, Price, AuthorFROM BookDetails

以下结果显示:

在上面的结果中,有些列包含缺少或者未知的值。 SQL保留 NULL 关键字来表示未知或者丢失的值。 在 SQL NULL 中的处理方式与值不同。 比较 NULL 值或者在表达式中使用时需要特别考虑。

比较中的空值

开发人员,尤其是不理解 NULL 工作原理的开发人员,有时会使用比较操作符将表达式与 NULL 值进行比较。

SELECT BookId, Title, ReleaseDate, Price, AuthorFROM BookDetailsWHERE ReleaseDate = NULL

假设 NULL 是一个有效值,可以与其他 NULL 值进行比较。 因此,上面的语句应该返回 ReleaseDate 值为 NULL的每一行。 因此 BookId 1, 3 将作为假设逻辑的结果返回。 但是数据库引擎无法将任何东西与( NULL to NULL ) 进行比较。 它将返回并清空结果集。

我们需要返回 non- NULL 数据:

SELECT BookId, Title, ReleaseDate, Price, AuthorFROM BookDetailsWHERE ReleaseDate <> NULL

上面的语句试图将实际的NULL 值与 NULL. 比较,它似乎是一个可靠的逻辑。 因此 BookId 2, 45 将作为假设逻辑的结果返回。 但是我们无法将真正的值与。 结果,尽管我们知道某些数据存在,但语句仍然没有返回任何数据。

Proper way to do the NULL comparison

SQL覆盖了这种困境。 我们可以使用 IS NULLIS NOT NULL 比较来测试 NULL 值。

SELECT BookId, Title, ReleaseDate, Price, AuthorFROM BookDetailsWHERE ReleaseDate ISNULL

上面的SELECT 语句使用 IS NULL 运算符返回 ReleaseDateNULL的行。

SELECT BookId, Title, ReleaseDate, Price, AuthorFROM BookDetailsWHERE ReleaseDate ISNOTNULL

上面的SELECT 语句使用 IS NOT NULL 运算符返回它的ReleaseDate 不是 NULL的行。

为空值比较设置 ANSI_NULL

SQL Server 支持一个称为 ANSI_NULLS的特性,它决定了数据库引擎如何处理 NULL 比较。 选项 ANSI_NULLS 控制是否可以使用相等运算符和 NULL 来表示与 IS NULL 相同的东西。 ANSI SQL标准指定 NULL 永远不等于任何东西。

默认情况下,SQL Server 随 ANSI_NULLS 选项一起安装,这会给出上面描述的结果。

检查当前 ANSI_NULLS 设置:

IF ((32 & @@OPTIONS) = 32)
 PRINT'The ANSI_NULLS option turned on.'ELSEPRINT'The ANSI_NULLS option turned off.'

如果数据库引擎中没有 ANSI_NULLS 更改,则会返回" ANSI_NULLS 选项。"

我们可以关闭 ANSI_NULLS 选项。 SET命令仅更改我们发出命令的连接的行为。 如果在存储过程中发出SET命令,该命令通常控制过程的行为。

SETANSI_NULLSOFF;SELECT BookId, Title, ReleaseDate, Price, AuthorFROM BookDetailsWHERE ReleaseDate = NULL

SETANSI_NULLSOFF;SELECT BookId, Title, ReleaseDate, Price, AuthorFROM BookDetailsWHERE ReleaseDate <> NULL

ISNULL &为空

ISNULLIS NULL的另一个混淆。 ISNULL 表示与 IS NULL 运算符类似的含义。 让我们用例子来了解。

返回作者值为 NULL的图书详细信息。

SELECT BookId, Title, ReleaseDate, Price, AuthorFROM BookDetailsWHERE Author ISNULL

如果不理解 ISNULL,我们可能尝试通过在 WHERE 子句中使用 ISNULL 来检索相同的结果:

SELECT BookId, Title, ReleaseDate, Price, AuthorFROM BookDetailsWHERE ISNULL(Author)

幸运的是,我们可能会得到错误消息。

ISNULL 函数的作用是将表达式的值替换为实际值。 如果要返回上面的示例,我们需要正确定义布尔条件。

SELECT BookId, Title, ReleaseDate, Price, AuthorFROM BookDetailsWHERE ISNULL(Author, 'nonexistent') IN ('nonexistent')

通常,我们希望使用 ISNULL 函数在 SELECT 语句中以表达式的值替换 NULL 值。

SELECT BookId, Title, ReleaseDate, Price, ISNULL(Author, 'nonexistent') AS AuthorFROM BookDetails

Author 现在为所有行设置一个值。 所有 NULL 均已经更改为 nonexistent.

合并

更进一步,ISNULL 在 SQL Server 中实现是特定于那个 T-SQL的,COALESEC 是标准的ANSI。 这两个函数让我们用表达式的值替换 NULL,但这两个函数之间存在差异。 COALESEC 函数允许多于两个表达式。

例如下面的SELECT 语句从 StudentDetails 表返回数据。

SELECT StudentId, StudentName, Department, Semester_I, Semester_II, Semester_IIIFROM StudentDetails

让我们在上面的SELECT 语句中应用 COALESE 函数。

SELECT StudentId, StudentName, Department, 
Semester_I, Semester_II, Semester_III,COALESCE(Semester_I, Semester_II, Semester_III, 0) AS COALESCE_ResultFROM StudentDetails

COALESCE 函数按照指定的顺序计算表达式并返回第一个 non-NULL 值。 COALESE_Result 列显示 COALESE 函数结果。

实际上 COALESCE 函数是 CASE 表达式的shorthand,但 CASE 表达式构造复杂。 CASE 表达式的优点是,它显示的逻辑非常清晰。

SELECT StudentId, StudentName, Department, 
Semester_I, Semester_II, Semester_III,COALESCE(Semester_I, Semester_II, Semester_III, 0) AS COALESCE_Result,CASEWHEN Semester_I ISNOTNULLTHEN Semester_I
 WHEN Semester_II ISNOTNULLTHEN Semester_II
 WHEN Semester_III ISNOTNULLTHEN Semester_III
 ELSE0END CASE_ResultFROM StudentDetails

合并 vs ISNULL

ISNULL 函数是有限的只指定两个表达式。

SELECT StudentId, StudentName, Department, 
Semester_I, ISNULL(Semester_II, 0) AS ISNULL_Result, Semester_IIIFROM StudentDetails

在本例中,我们定义了如果 Semester_IINULL,那么使用 0

COALESCE 以不同方式处理数据类型。 为了理解这个问题,我们从一个例子开始:

SELECT StudentId, StudentName, Department, Semester_I, Semester_II, Semester_IIIFROM StudentDetailsWHERE StudentId = 5

StudentIdSemester_ISemester_IISemester_III 列被定义为 IntStudentNameDepartment 列定义为 Varchar。 上面的语句返回以下结果。

现在让我们来包括 COALESCE 函数。

SELECT StudentId, StudentName, Department, Semester_I, Semester_II, Semester_III,COALESCE(Department, StudentName, Semester_I) AS COALESCE_ResultFROM StudentDetailsWHERE StudentId = 5

这一次,我们将得到一条错误消息。

COALESCE 根据提交的值使用具有最高优先级的类型。 Semester_I 列采用 IntInt 优先于 Varchar。 因此数据库引擎试图将 EEE 转换为 Int 值。 数据库引擎不关心订单。

现在让我们来包括 INSULL 函数。

SELECT StudentId, StudentName, Department, Semester_I, Semester_II, Semester_III,
ISNULL(Department, Semester_I) AS ISNULL_ResultFROM StudentDetailsWHERE StudentId = 5

在上 SELECT 语句 ISNULL 函数 Department 设置了标准,它是一个 Varchar 数据类型。 所以数据库引擎没有问题。

现在,我们来改变 ISNULL 函数的顺序。

SELECT StudentId, StudentName, Department, Semester_I, Semester_II, Semester_III,
ISNULL(Semester_I, Department) AS ISNULL_ResultFROM StudentDetailsWHERE StudentId = 5

这一次,我们会得到一条错误消息。 因为 Semester_I 设置了标准,它是 Int 数据类型。 因此数据库引擎无法将'EEE'转换为 Int 数据类型。

任何值+ NULL = 任何值?

如果我们试图做计算,像添加一个值,或者从没有什么或者乘什么,或者乘什么,什么也没有做,我们最终得到的是什么,或者是 NULL。 请看下面的SELECT 语句:

SELECT StudentId, StudentName, Department, Semester_I, Semester_II, Semester_III,
(Semester_I + Semester_II + Semester_III) AS TotalResultFROM StudentDetailsWHERE StudentId = 5

当我们尝试用 NULL 计算( 这里使用了加法) 时,我们得到了 NULL。 我们可以通过为 NULL 定义一个默认值来使它变得合理。

SELECT StudentId, StudentName, Department, Semester_I, Semester_II, Semester_III,
(ISNULL(Semester_I, 0) + ISNULL(Semester_II,0) + ISNULL(Semester_III,0)) AS TotalResultFROM StudentDetailsWHERE StudentId = 5

在这里,我们使用 ISNULL 函数和默认值作为add函数中每个参数的0。 所以现在 Semester_I 返回 0,所以 TotalResult 显示 90

SELECT StudentId, StudentName, Department, Semester_I, Semester_II, Semester_III,
ISNULL((Semester_I + Semester_II + Semester_III),0) AS TotalResultFROM StudentDetailsWHERE StudentId = 5

在这里,我们使用了 ISNULL 函数,默认值为 0,作为 Addition的结果。

所以 Semester_INULL,然后 Addition 结果返回 NULL。 外部 ISNULL 函数返回默认值 0

摘要

我希望这个解释已经给了一些信息来处理 SQL Server 中的NULL



文章标签:Server  NULL  NUL  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语