将IS NULL转换为BIT

时间:2016-04-27 11:36:23

标签: sql-server tsql sql-server-2014

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

为什么SQL Server无法将NULL的检查转换为BIT?我在考虑这样的事情:

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

预期结果可能是10

4 个答案:

答案 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 NULLIS NOT NULL谓词,可用于条件表达式。这意味着他们自己不会返回价值。因此,他们无法“铸造”#34;一点点,或被视为布尔值。

  

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

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

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

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

答案 3 :(得分:0)

或者使用IIF(比CASE更易读):

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