不等于<>!=运算符为NULL

Max*_*ich 255 sql t-sql sql-server null

有人可以在SQL中解释以下行为吗?

SELECT * FROM MyTable WHERE MyColumn != NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn <> NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn IS NOT NULL (568 Results)
Run Code Online (Sandbox Code Playgroud)

OMG*_*ies 293

<>是标准SQL-92; !=是等价的.两者都评估值,这NULL不是 - NULL是一个占位符,表示没有值.

这就是为什么你只能使用IS NULL/ IS NOT NULL作为这种情况的谓词.

此行为不是特定于SQL Server.所有符合标准的SQL方言都以相同的方式工作.

注意:要比较您的值是否为null,请使用IS NOT NULL,而要与非空值进行比较时使用<> 'YOUR_VALUE'.我不能说我的值是否等于NULL,但我可以说我的值是NULL还是NOT NULL.如果我的值不是NULL,我可以比较.

  • 还应该注意的是,因为`!=`只评估值,所以执行类似`WHERE MyColumn!='somevalue'的操作将不会返回NULL记录. (9认同)
  • 实际上,我相信它是92的规范中的"<>",但大多数供应商支持`!=`和/或它包含在后来的规范中,如99或03. (4认同)
  • @Thomas:据我所知,Oracle不支持`!=`直到~9i,这带来了很多ANSI-92语法.我相信MySQL是类似的,在4.x中开始支持. (2认同)
  • WHERE MyColumn!= NULL或WHERE MyColumn = NULL是确定的吗?或者换句话说,不管“ MyColumn”在数据库中是否可以为空,是否保证总是返回0行? (2认同)

Bar*_*own 84

NULL没有值,因此无法使用标量值运算符进行比较.

换句话说,没有值可以等于(或不等于)NULL,因为NULL没有值.

因此,SQL具有特殊的IS NULL和IS NOT NULL谓词来处理NULL.

  • 出于兴趣,是否存在这种(预期)行为有用的情况?在我看来,有一个''a'!= null`没有返回一个值(`true` /`1`)是反直觉的,并且不时地抓住我!我曾经想过"与没有价值相比,某些价值"总是"不相等",但也许那只是我?!? (13认同)
  • 我并不是说这是微软唯一的行为.我只是说我在Microsoft SQL Server上观察到它. (5认同)
  • +1.而且,与OP声明相反,这不是"Microsoft SQL".三元逻辑在SQL标准中定义,MS在这一点上遵循标准. (3认同)
  • 我认为有趣的是人们将 NULL 描述为 '_have no value_' 。类似于,当数字 1 实际上是一个值时,就说它“有一个值”。但是 NULL 代表非值.. (2认同)

Cad*_*oux 26

请注意,此行为是默认(ANSI)行为.

如果你:

 SET ANSI_NULLS OFF
Run Code Online (Sandbox Code Playgroud)

http://msdn.microsoft.com/en-us/library/ms188048.aspx

你会得到不同的结果.

SET ANSI_NULLS OFF 显然将来会消失......

  • +1 ......不够快.现在什么时候可以在索引中获得"重复"的NULL?:( (7认同)
  • **来自[msdn doc]的重要**说明(http://msdn.microsoft.com/en-us/library/ms188048.aspx):*在SQL Server的未来版本[比2014年更新]中,ANSI_NULLS将始终为ON,任何明确将选项设置为OFF的应用程序都将生成错误.**避免在新的开发工作中使用此功能**,并计划修改当前使用此功能的应用程序.* (4认同)
  • 来自文档的注释:_当`SET ANSI_NULLS`为OFF时,Equals(=)和Not Equal To(<>)比较运算符不遵循ISO标准.使用`WHERE column_name = NULL`的SELECT语句返回column_name中具有空值的行.使用`WHERE column_name <> NULL`的SELECT语句返回列中具有非空值的行.此外,使用`WHERE column_name <> XYZ_value`的SELECT语句将返回非XYZ_value且不是NULL的所有行.恕我直言,这最后一个语句似乎有点奇怪,它从结果中排除了空值! (3认同)

Man*_*ngo 8

null表示没有值或未知值。它没有说明原因没有值,这可能会导致一些歧义。

\n

假设您运行如下查询:

\n
SELECT *\nFROM orders\nWHERE delivered=ordered;\n
Run Code Online (Sandbox Code Playgroud)\n

也就是说,您正在查找ordereddelivered日期相同的行。

\n

当一列或两列都为空时会出现什么情况?

\n

由于至少其中一个日期是未知的,因此您不能指望说这 2 个日期是相同的。当两个日期都未知时也是如此:如果我们甚至不知道它们是什么,它们怎么可能相同呢?

\n

因此,任何视为null值的表达式都必定会失败。在这种情况下,它将不匹配。如果您尝试以下操作,也会出现这种情况:

\n
SELECT *\nFROM orders\nWHERE delivered<>ordered;\n
Run Code Online (Sandbox Code Playgroud)\n

再说一次,如果我们不知道两个值是什么,我们怎么能说它们不同呢?

\n

SQL 对缺失值有一个特定的测试:

\n
IS NULL\n
Run Code Online (Sandbox Code Playgroud)\n

具体来说,它不是比较值,而是寻找缺失值。

\n

最后,关于!=运营商,据我所知,它实际上不在任何标准中,但它得到了广泛的支持。添加它是为了让某些语言的程序员感觉更自在。坦率地说,如果程序员很难记住他们使用的语言,那么他们的开始就很糟糕。

\n


dkr*_*etz 7

对NULL的唯一测试是IS NULL或IS NOT NULL.对等式进行测试是没有意义的,因为根据定义,人们不知道该值是什么.

这是一篇维基百科文章:

https://en.wikipedia.org/wiki/Null_(SQL)


Mah*_*iya 7

在SQL中,您评估/计算的任何NULL结果都是UNKNOWN

这就是为什么SELECT * FROM MyTable WHERE MyColumn != NULLSELECT * FROM MyTable WHERE MyColumn <> NULL给你0结果.

为了提供NULL值的检查,提供了isNull函数.

此外,您可以使用IS第三个查询中使用的运算符.

希望这可以帮助.

  • “在 SQL 中,任何使用 NULL 进行评估/计算的结果都会变成‘NULL’”——不正确。你所说的结果是未知的。 (3认同)

Jef*_*ler 6

我们用

SELECT * FROM MyTable WHERE ISNULL(MyColumn, ' ') = ' ';
Run Code Online (Sandbox Code Playgroud)

返回MyColumn为NULL的所有行或MyColumn为空字符串的所有行.对于许多"最终用户"来说,NULL与空字符串问题是一种区别,没有必要和混淆点.


Vin*_*nie 5

NULL 不能与使用比较运算符的任何值进行比较。NULL = NULL 为假。Null 不是一个值。IS 运算符专门设计用于处理 NULL 比较。

  • “NULL = NULL 是假的” 事实并非如此。NULL = NULL 评估为 **unknown** 而不是 false。 (8认同)
  • 当我有时使用 `null = null` 时,我总是喜欢让人们感到困惑,而人们可能会在某些临时查询中使用 `1=0`。如果他们抱怨,我将其更改为 `null != null` :) (5认同)

Hrv*_*nek 5

我只是看不到null不能与其他值或其他null相提并论的功能性和无缝原因,因为我们可以清楚地比较它,并说它们在我们的上下文中是相同还是不同。这很有趣。仅仅由于一些合乎逻辑的结论和一致性,我们需要不断地对其进行打扰。它不是功能性的,要使其更具功能性,然后让哲学家和科学家们来断定它是否一致,是否具有“普遍逻辑”。:)有人可能会说这是由于索引或其他原因造成的,我怀疑这些东西是否无法支持与值相同的null。就像比较两个空杯子,一个是藤蔓玻璃,另一个是啤酒杯,我们不是在比较对象的类型,而是它们包含的值,就像可以比较int和varchar一样,将其为null。甚至更容易,没有什么和两个虚无的共同点是什么,它们是相同的,对于我和其他编写sql的其他人来说,它们显然是可比较的,因为由于某些ANSI标准,我们不断以奇怪的方式比较它们来打破这种逻辑。为什么不使用计算机功能为我们做这件事,我怀疑如果考虑到所有相关内容,它会减慢速度。“这不是null,什么也不是”,不是苹果,而是apfel,加油...从功能上来说是您的朋友,这里也有逻辑。最后,唯一重要的是功能,并且以这种方式使用null会带来或多或少的功能和易用性。它更有用吗?因为我们由于某些ANSI标准而不断以奇怪的方式进行比较来打破这种逻辑。为什么不使用计算机功能为我们做这件事,我怀疑如果考虑到所有相关内容,它会减慢速度。“这不是null,什么也不是”,不是苹果,而是apfel,加油...从功能上来说是您的朋友,这里也有逻辑。最后,唯一重要的是功能,并且以这种方式使用null会带来或多或少的功能和易用性。它更有用吗?因为我们由于某些ANSI标准而不断以奇怪的方式进行比较来打破这种逻辑。为什么不使用计算机功能为我们做这件事,我怀疑如果考虑到所有相关内容,它会减慢速度。“这不是null,什么也不是”,不是苹果,而是apfel,加油...从功能上来说是您的朋友,这里也有逻辑。最后,唯一重要的是功能,并且以这种方式使用null会带来或多或少的功能和易用性。它更有用吗?不是苹果,它是apfel,加油...从功能上来说是您的朋友,并且这里也有逻辑。最后,唯一重要的是功能,并且以这种方式使用null会带来或多或少的功能和易用性。它更有用吗?不是苹果,它是apfel,加油...从功能上来说是您的朋友,并且这里也有逻辑。最后,唯一重要的是功能,并且以这种方式使用null会带来或多或少的功能和易用性。它更有用吗?

考虑以下代码:

SELECT CASE WHEN NOT (1 = null or (1 is null and null is null)) THEN 1 ELSE 0 end
Run Code Online (Sandbox Code Playgroud)

你们当中有多少人知道这段代码会返回什么?无论是否设置NOT,它都将返回0。对我来说,它不起作用并且令人困惑。在c#中,比较操作应该返回值,从逻辑上讲,这也会产生值,因为如果没有,则没有什么可比较的(nothing :)除外)。他们只是“说”:与null相比,任何东西都“返回” 0,这会造成许多变通方法和麻烦。

这是使我来到这里的代码:

where a != b OR (a is null and b IS not null) OR (a IS not null and b IS null)
Run Code Online (Sandbox Code Playgroud)

我只需要比较两个字段(在哪里)具有不同的值,就可以使用函数,但是...

  • 答对了!的答案和逻辑讨论。由于不允许代码以合理的方式处理空值,因此存在无数的错误和解决方法。 (2认同)