奇怪的SQL结果

时间:2012-10-18 22:48:01

标签: sql tsql

所以我有以下查询

Select id, [First], [Last] , [Business] as contactbusiness, (Case When ([Business] != '' or [Business] is not null) 
        Then [Business] Else 'No Phone Number' END) from contacts

结果看起来像

id  First   Last    contactbusiness (No column name)
2   John    Smith       
3   Sarah   Jane    0411 111 222    0411 111 222
6   John    Smith   0411 111 111    0411 111 111
8                   NULL            No Phone Number
11  Ryan    B       08 9999 9999    08 9999 9999
14  David   F       NULL            No Phone Number

我希望记录2也显示无电话号码

如果我将“[Business] not null”更改为[Business]!= null,那么我会得到正确的结果

id  First   Last    contactbusiness (No column name)
2   John    Smith                   No Phone Number
3   Sarah   Jane    0411 111 222    0411 111 222
6   John    Smith   0411 111 111    0411 111 111
8                   NULL            No Phone Number
11  Ryan    B       08 9999 9999    08 9999 9999
14  David   F       NULL            No Phone Number

通常你需要使用is not null而不是!= null。什么事发生在这里?

3 个答案:

答案 0 :(得分:3)

您需要在条件中使用AND,而不是OR

[Business] != '' and [Business] is not null

令人困惑,因为你使用底片。我只是翻转整个条件并使用正数(在这种情况下你会使用OR):

(Case When ([Business] == '' or [Business] is null) 
    Then 'No Phone Number' Else [Business] END)

答案 1 :(得分:2)

你的逻辑错了。检查两个底片时,您需要使用 AND

Case When ([Business] != '' AND [Business] is not null

答案 2 :(得分:2)

如上所述,你的逻辑是关闭的。你可以用

SELECT id, [First], [Last] , [Business] AS contactbusiness, 
    COALESCE(NULLIF([Business], ''), 'No Phone Number')
FROM contacts

SQL更加浓缩

If i change the "[Business] is not null" to [Business] != null then i get the correct results的工作原因是[Business] != null始终为假。

正如您所提到的,SQL使用is运算符检查空值,并且空值的相等比较总是失败(试验select 'hi' where (null = null)select 'hi' where (null != null))。使用OR语句和短路意味着:

  1. 当电话号码存在时,第一个条件[Business] != ''为真。因此,OR状态为真,并且使用了电话号码
  2. 当第一个条件失败时,第二个条件[Business] != null也为假。因此,OR语句为false,并显示“No Phone Number”