将 IS NULL 转换为 BIT


这可能是

一个非常基本的问题,但我只是在编写查询时遇到了它。

为什么 SQL Server 无法将 NULL 的支票转换为BIT?我在想这样的事情:

DECLARE @someVariable INT = NULL;
-- Do something
SELECT CONVERT(BIT, (@someVariable IS NULL))

然后,预期的结果将是10

使用 case

SELECT CONVERT(BIT, (CASE WHEN @someVariable IS NULL THEN 1 ELSE 0 END))

或者使用 IIF(比 CASE 更具可读性):

CONVERT(BIT, IIF(@x IS NULL, 0, 1))

不是直接演员表

select cast(isnull(@null,1) as bit)

在 SQL 语言中,NULL 被视为数据值。它们表示缺失/未知状态。引用维基百科关于SQL NUL的文章:

SQL null 是一个状态(未知),而不是一个值。这种用法与大多数编程语言完全不同,其中 null 表示未分配给特定实例。

这意味着与该UNKNOWN值的任何比较只能UNKNOWN本身。即使比较两个 NULL 也不能返回 true:如果两个值都是未知的,我们怎么能说它们相等或不相等?

IS NULLIS NOT NULL 是可在条件表达式中使用的谓词。这意味着它们本身不返回值。因此,它们不能被"投射"到位,或被视为布尔值。

在将任何内容与 Null 进行比较时,基本 SQL 比较运算符始终返回 Unknown,因此 SQL 标准提供了两个特定于 Null 的特殊比较谓词。IS NULL 和 IS NOT NULL 谓词(使用后缀语法)测试数据是否为 Null。

处理 null 的任何其他方法是特定于供应商的扩展。

最后,BIT不是布尔类型,它只是一个单位数字。SQL 1999 中引入了可选的BOOLEAN类型,但只有 PostgreSQL 正确实现了它,即具有 TRUEFALSEUNKNOWN值。

如果没有BOOLEAN类型,则无法真正计算A AND Bx IS NULL等条件表达式的结果。只能使用 NULLIFCOALESCE 等函数将 NULL 值替换为其他值。

最新更新