这可能是一个非常基础的问题,但我在编写查询时遇到了它。
为什么SQL Server无法将对NULL
的检查转换为BIT
? 我在考虑像这样的东西:
DECLARE @someVariable INT = NULL;
-- Do something
SELECT CONVERT(BIT, (@someVariable IS NULL))
预期结果将是 1
或 0
。
这可能是一个非常基础的问题,但我在编写查询时遇到了它。
为什么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))
CASE
来实现这一点。但是我想知道为什么SQL Server不知道如何处理@someVariable IS NULL
。 - diiN__________IS NULL
视为布尔表达式是毫无意义的。 - Panagiotis KanavosIS NULL
不是一个表达式。如果MySQL这样处理它,那么它就违反了SQL标准和三值逻辑。这不是讨论的问题 - 这就是SQL的定义。 - Panagiotis Kanavos或者使用 IIF
函数(比 CASE
更易读):
CONVERT(BIT, IIF(@x IS NULL, 0, 1))
非直接转换
select cast(isnull(@null,1) as bit)
SELECT CONVERT(BIT, (@someVariable=123))
(即没有NULL参与),你是否会补充其他内容? - Álvaro GonzálezCAST
的有效表达式以及标准和供应商实现之间的差异,最后是否可以在SQL中使用比较返回值。 - Panagiotis KanavosNULLIF
,而是关于 NULL 的处理方式以及为什么 IS NULL
不返回值。 - Panagiotis Kanavos
IS
不能在条件表达式之外使用。它不是比较运算符。在空值逻辑中,任何与 NULL 的比较都是 null。IS NULL
和IS NOT NULL
是唯一可用的 条件 运算符。 - Panagiotis Kanavosfoo=NULL
和foo IS NULL
是不同的(以及为什么)。但是,是否有某些特定情况下 MySQL 实现会出现问题?毕竟,当您使用WHERE deletion_date IS NULL
时,最终会得到一个布尔非空决策:显示行还是不显示。 - Álvaro GonzálezNULL
,只需使用像NULLIF
或COALESCE
这样的函数。最后,您可以将NULL强制转换为表示特定类型缺失值的NULL。CAST(NULL as BIT)
是允许的,并返回一个NULL BIT。 - Panagiotis Kanavos