2011-08-18 52 views
1

我确定SQL中有一个类似“DifferentThan”的方法。
我不是在寻找<>运营商,这将失败NULL比较。是否有SQL值“DifferentThan”比较方法

例如,想象一个可为空的位列。

当“不是真正的”我可以做这样的事情

WHERE COALESCE(myBit,0) = 0 

和检查也许这是最好的方法......我真的不感兴趣。我特别试图回忆为类似“DIFFERENTTHAN”

WHERE myBit DIFFERENTTHAN 1 

编辑语法:我下面回答我自己的问题。

+0

你使用什么SQL方言?唯一解决我所见过的问题的方法是COALESCE技巧,正如你所说,这是你想要避免的。 –

+0

@Joel Brown这不是我想要*避免* COALESCE',而是更想记住我以前见过的这种特殊语法。 – Matthew

+0

FWIW,我从来没有听说过这样的关键字。 –

回答

0

你可以试试这个

WHERE NOT myBit = 1 

这是不是一个单一的运营商,但比使用COALESCE清洁了一下。

+0

这也行不通。它与'<>'相同的方式失败了'NULL'比较。要测试:'SELECT'测试'WHERE NOT 1 = NULL' – Matthew

+0

NULL = 1的计算结果为false,这会导致我们NOT FALSE,这是TRUE。因此,对于除1以外的任何值,它都会返回TRUE。 – Kibbee

+1

我相信三值逻辑,NULL = 1的计算结果为NULL。 –

1

对于标准 ANSI/ISO SQL,空行为是相当严格定义。简而言之:

  • 涉及NULL值所有表达式求值NULL,除了coalesce()

  • 涉及NULL值的所有测试均失败,但明确测试无效。以下失败:

    • X = null
    • null = null
    • X < null

    实质上,NULL是位于可变的结构域之外的值。这意味着逆比较运算符不对称WRT到NULL

下面的所有表达式,如果涉及null,失败并且空值落空。

* `X < null` 
* `X >= null` 
* `X > null` 
* `not (X > null)` 
* etc. 

In standard SQL, test for `null`/`not null`, one **must** use `IS [NOT] NULL`. 

在你的情况下,有一个测试成功,如果一个值为null,你可以做这样的事情:

  • where (A = B or B is null)。 这将会失败A是空的,B是非空的,或者A和B非空并且比较不等于。如果A和B非空且比较相等,或者B为空,则它成功。
  • where A = coalesce(B,A)。这与上述表达式的行为相同。我倾向于更喜欢它,因为语法更简洁。

注意某些SQL实现允许从标准(MS /的Sybase的Transact-SQL例如不同空行为,必须允许与标准比较运营商无效检测,并允许空char/varchar至选项在SQL Server的早期版本中,无效是通过将列的可变长度来实现的,无论其类型如何,空值的存储长度为零,对于char/varchar字段,无(空)字符串被存储为单个空间,不完全直观,作为副作用,像foo char(8) null这样的声明相当于声明它为foo varchar(8) null

即使您的SQL实现支持非标准的空行为,您应该避免它,并且将其编码为具有ANSI空行为的标准SQL。在大多数支持非标准空行为的实现中,该行为可通过运行时选项进行配置。无论您是否在标准ANSI空值行为下运行,您的标准编码都会得到相同的结果。

+0

你的答案似乎与我的答案中发布的链接中的Itzik Ben-Gan构成的解决方案形成对比。 – Matthew

+0

因为我从来没有见过在执行IS DISTINCT FROM在野外— SQL Server,DB2和Oracle都不支持它—我必须将特定的SQL99语言特性归档为“很高兴有”。由于我不能编写利用假想语言功能的代码,就像大多数人一样,我坚持使用具有IS [NOT] NULL的复合条件来实现我想要的行为。 –

相关问题