这可能是一个非常基本的问题,但我只是在编写查询时遇到过它。
为什么SQL Server无法将NULL
的检查转换为BIT
?我在考虑这样的事情:
DECLARE @someVariable INT = NULL;
-- Do something
SELECT CONVERT(BIT, (@someVariable IS NULL))
预期结果可能是1
或0
。
答案 0 :(得分:11)
使用case
:
SELECT CONVERT(BIT, (CASE WHEN @someVariable IS NULL THEN 1 ELSE 0 END))
答案 1 :(得分:2)
不是直接演员
select cast(isnull(@null,1) as bit)
答案 2 :(得分:1)
在SQL语言中,NULL 不被认为是数据值。它们代表一个缺失/未知的状态。引自Wikipedia's article on SQL NULL:
SQL null是状态(未知)而不是值。这种用法与大多数编程语言完全不同,其中null表示未分配给特定实例。
这意味着针对该UNKNOWN
值的任何比较本身只能是UNKNOWN
。即使比较两个NULL也不能返回true:如果两个值都是 unknown ,我们怎么能说它们是否相等?
IS NULL
和IS NOT NULL
是谓词,可用于条件表达式。这意味着他们自己不会返回价值。因此,他们无法“铸造”#34;一点点,或被视为布尔值。
在将任何内容与Null进行比较时,基本SQL比较运算符始终返回Unknown,因此SQL标准提供了两个特殊的Null特定比较谓词。 IS NULL和IS NOT NULL谓词(使用后缀语法)测试数据是否为Null。
处理空值的任何其他方法都是特定于供应商的扩展。
最后,BIT
不是布尔类型,它只是一个比特数。 SQL 1999中引入了可选的BOOLEAN
类型,但只有PostgreSQL正确实现了它,即具有TRUE
,FALSE
或UNKNOWN
值。
如果没有BOOLEAN
类型,您无法真正计算条件表达式的结果,例如A AND B
或x IS NULL
。您只能使用NULLIF
或COALESCE
等函数将NULL值替换为其他值。
答案 3 :(得分:0)
或者使用IIF
(比CASE
更易读):
CONVERT(BIT, IIF(@x IS NULL, 0, 1))