一个非常基本的问题,但我只是在编写查询时遇到了它。
为什么 SQL Server 无法将 NULL
的支票转换为BIT
?我在想这样的事情:
DECLARE @someVariable INT = NULL;
-- Do something
SELECT CONVERT(BIT, (@someVariable IS NULL))
然后,预期的结果将是1
或0
。
使用 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 NULL
和 IS NOT NULL
是可在条件表达式中使用的谓词。这意味着它们本身不返回值。因此,它们不能被"投射"到位,或被视为布尔值。
在将任何内容与 Null 进行比较时,基本 SQL 比较运算符始终返回 Unknown,因此 SQL 标准提供了两个特定于 Null 的特殊比较谓词。IS NULL 和 IS NOT NULL 谓词(使用后缀语法)测试数据是否为 Null。
处理 null 的任何其他方法是特定于供应商的扩展。
最后,BIT
不是布尔类型,它只是一个单位数字。SQL 1999 中引入了可选的BOOLEAN
类型,但只有 PostgreSQL 正确实现了它,即具有 TRUE
、FALSE
或UNKNOWN
值。
如果没有BOOLEAN
类型,则无法真正计算A AND B
或x IS NULL
等条件表达式的结果。只能使用 NULLIF
或 COALESCE
等函数将 NULL 值替换为其他值。