我应该使用!=或<>在T-SQL中不相等吗?

Bob*_*tor 780 sql t-sql sql-server

我已经看到了SQL同时使用!=,并<>不相等.什么是首选语法,为什么?

我喜欢!=,因为<>让我想起Visual Basic.

Bil*_*win 713

大多数数据库支持!=(流行的编程语言)和<>(ANSI).

同时支持数据库!=<>:

支持ANSI标准算,数据库独家:

  • IBM DB2 UDB 9.5: <>
  • Microsoft Access 2010: <>

  • C#中的@TomStickel LINQ不是SQL. (9认同)
  • @buffer,它们在逻辑上*相同,也就是说,它会匹配或排除同一组行.但是,特定的RDBMS品牌是否优化它是依赖于实现的.也就是说,如果各个品牌的数据库存在任何差异,我会感到惊讶. (7认同)

DBA*_*rew 524

从技术上讲,如果您使用的是SQL Server AKA T-SQL,它们的功能相同.如果您在存储过程中使用它,则没有性能原因可以使用一个而不是另一个.然后归结为个人偏好.我更喜欢使用<>,因为它符合ANSI标准.

您可以在...找到各种ANSI标准的链接.

http://en.wikipedia.org/wiki/SQL

  • 我一直更喜欢使用`!=`,因为它存在于我使用的每个受C影响的语言中,并且因为[Python文档](http://docs.python.org/reference/expressions.html#notin)说:"形式`<>`和`!=`是等价的;为了与C的一致性,首选`!=`;在`<>`下面提到`!=`也是可接受的.` <>`拼写被认为是过时的." 但SQL不是Python! (39认同)
  • 是; 微软自己建议使用`<>`over`!=`专门用于ANSI合规,例如在Microsoft Press培训套件中进行70-461考试,"查询Microsoft SQL Server",他们说"作为何时选择标准表格的一个例子" ,T-SQL支持两个"不等于"运算符:<>和!=.前者是标准的而后者不是.这种情况应该是一个nobrainer:去标准的!" (31认同)
  • 我喜欢使用<>因为它让我想起了XML.但SQL不是XML! (23认同)
  • 我喜欢<>因为它更容易输入. (7认同)
  • 我总是更喜欢 != 而不是 &lt;&gt;,因为 != 与我所知道的每一种编程语言都是一致的,我知道第一次开始使用 SQL 的程序员,每当他们看到 &lt;&gt; 时,他们就会想到那是什么? (2认同)

Ada*_*sek 106

'<>'来自SQL-92标准,'!='是一个专有的 T-SQL运算符.它也可以在其他数据库中使用,但由于它不是标准的,因此必须根据具体情况进行处理.

在大多数情况下,您将知道您要连接的数据库,因此这不是一个真正的问题.在最坏的情况下,您可能需要在SQL中进行搜索和替换.

  • @JohanBoule很好,有一个SQL的书面标准,据我所知`!=`不是它的一部分.虽然出于所有实际目的,它是一个事实上的标准,但我们不应该混淆什么是标准特征而不是标准特征. (3认同)
  • 我们可以继续将这种广泛的扩展称为标准语言a*proprietary*one吗?在这一点上,似乎标准应该更新为要求,或者至少允许两种语法. (2认同)

Meh*_*ari 43

ANSI SQL标准定义<>为"不等于"运算符,

http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ( 5.2 <token> and <separator>)

!=根据ANSI/SQL 92标准,没有运算符.

  • @Yunfei Chen 重点不在于人们可能会在*仅*支持 ANSI/SQL 92 标准中包含的内容的系统中进行编写。关键是,ANSI/SQL 92 标准中包含的内容比标准中未包含的内容在数据库系统中具有更广泛的一致覆盖范围。这就是选择“&lt;&gt;”的充分理由。如果有人创建了一个新的 DBMS,您现有的数据库代码有一天可能会移植到其中,并且它只支持两个运算符之一 - 它更有可能是“&lt;&gt;”而不是“!=”。 (4认同)

Jus*_*ner 33

<> 是根据SQL-92标准的有效SQL.

http://msdn.microsoft.com/en-us/library/aa276846(SQL.80).aspx

  • 两者都有效,但'<>'是SQL-92标准. (3认同)

mad*_*lor 23

它们对SQL Server都有效且相同,

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/not-equal-to-transact-sql-exclamation

  • @Joel Coehoorn,如果你非常移植你的T-SQL代码"<>"和"!="将是你最不担心的! (6认同)

Kyl*_*yle 19

看来微软自己更喜欢<>!=证明其表约束.我个人更喜欢使用,!=因为我清楚地将其视为"不相等",但如果您输入[field1 != field2]并将其保存为constrait,则下次查询时,它将显示为[field1 <> field2].这告诉我,正确的做法是<>.


小智 16

!=尽管是非ANSI的,但它更符合SQL作为可读语言的真正精神.它尖叫不平等. <>说这对我来说(少于,大于),这只是奇怪的.我知道它的意图是小于或大于不相等,但这是一种非常简单的说法.

我只需要进行一些长时间的SQL查询并将它们巧妙地放入XML文件中,因为我不会涉及到一大堆愚蠢的原因.

我只想说XML并没有<>完全!=失效,我不得不改变它们并在我操纵自己失败之前检查自己.

  • 为什么不只是CDATA呢?当您的查询包含XML时会发生什么? (6认同)
  • 当有人需要小于比较的查询时会发生什么?或者任何其他 XML 保留符号?这是我听过的最奇怪的理由,让我更喜欢其中一个。当您编写 C 代码时,您是否偏爱可以用 XML 表达而无需转义的运算符? (5认同)

Ste*_*eve 12

你可以在T-SQL中使用你喜欢的任何一个.文档说它们都以相同的方式运行.我更喜欢!=,因为它与我的(基于C/C++/C#)思想"不相等",但数据库大师似乎更喜欢<>.


Kar*_*arl 10

我知道C语法!=是在SQL Server中由于它的Unix传统(在Sybase SQL Server时代,在Microsoft SQL Server 6.5之前).


jit*_*hit 6

一个替代方案是使用其他运营商NULLIF比<>或者!=如果两个参数相等,返回NULL 在微软文档NULLIF.所以我相信WHERE子句可以进行修改<>!=如下:

NULLIF(arg1, arg2) IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

正如我发现的那样,在某些情况下使用<>!=不适用于日期.因此,使用上述表达式是必要的.

  • 对于所有极端情况下的索引使用,我不确定这个函数是否会像`<>`一样好.此外,可读性肯定更差...... (6认同)
  • 您可能正在比较具有时间成分的日期。恕我直言,使用 CAST(date1) AS DATE &lt;&gt; CAST(date2) AS DATE 是更好的方法 (2认同)