【问题标题】:SQL is null and = null [duplicate]SQL 为 null 且 = null [重复]
【发布时间】:2012-03-23 19:35:07
【问题描述】:

可能重复:
what is “=null” and “ IS NULL”
Is there any difference between IS NULL and =NULL

有什么区别

where x is null

where x = null

为什么后者不起作用?

【问题讨论】:

标签: sql null


【解决方案1】:

在 SQL 中,使用比较运算符(例如 =!=< 等)将 null 值与任何其他值(包括另一个 null)进行比较将导致 @ 987654327@,在where子句中被认为是false(严格来说,它是“不正确”,而不是“错误”,但效果是一样的)。

原因是null 表示“未知”,因此与null 进行任何比较的结果也是“未知”。因此,通过编码where my_column = null 不会对行造成任何影响。

SQL 提供了特殊语法来测试列是否为null,通过is nullis not null,这是测试null(或不是null)的特殊条件。

这里有一些 SQL,显示了上面的各种条件及其效果。

create table t (x int, y int);
insert into t values (null, null), (null, 1), (1, 1);

select 'x = null' as test , x, y from t where x = null
union all
select 'x != null', x, y from t where x != null
union all
select 'not (x = null)', x, y from t where not (x = null)
union all
select 'x = y', x, y from t where x = y
union all
select 'not (x = y)', x, y from t where not (x = y);

只返回 1 行(如预期的那样):

TEST    X   Y
x = y   1   1

SQLFiddle上看到这个运行

【讨论】:

  • 鉴于NULL = NULL 不是true,我们可以得出结论null 的语义在= 运算符的两侧是不同的。 LHS 它是一个概念,RHS 它是一个谓词。 (即“未知”与“未知”)。从本质上讲,这些是不相等的。 ▮
【解决方案2】:

请务必注意,NULL 不等于 NULL

NULL 不是一个值,因此不能与另一个值进行比较。

where x is null 检查 x 是否为空值。

where x = null 正在检查 x 是否等于 NULL,这永远不会是真的

【讨论】:

  • Null 是一个值,它只是未知值。就像在编程语言中一样,变量可以具有 null 值。此外,您可以比较 if(varA != null)。在 sql 虽然它的处理方式不同,就像你指出的那样。
  • @broadband: null 不是一个值,就像 infinity 不是一个数字一样。虽然这更像是一个哲学问题......是的,您可以将“null”分配给变量,但这仅意味着您正在取消或重置该变量。 0 或 "" 将是一个值,但 null 实际上意味着“此变量没有值”。
  • @Sygmoral 在内部写入 c# 字符串 a = null 时,这意味着您将值 null 设置为变量 a。但是程序员的解释就像你说的:'这个变量没有价值'。更进一步在sql中null可以有多种解释或三值逻辑。
  • @Sygmoral 如果你看一下波西米亚的回答,它会说:In SQL, a comparison between a null value。他也在写关于价值的文章。
【解决方案3】:

首先是检查字段值是否为null 的正确方法,而稍后将无法按您期望的方式工作,因为null 是不等于任何东西的特殊值,因此您不能使用相等比较使用=

因此,当您需要检查字段值是否为null 时,请使用:

where x is null

代替:

where x = null

【讨论】:

    【解决方案4】:

    我认为平等是可以绝对确定的。 null 的问题在于它本质上是未知的。 Null 与任何其他值组合为 null - 未知。询问 SQL“我的值是否等于 null?”每次都是未知的,即使输入是null。我认为IS NULL 的实现说明了这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 2019-06-16
      • 2015-08-02
      • 1970-01-01
      相关资源
      最近更新 更多