1

我正在尝试比较 2 个 uniqueidentifier 值,如下面的查询所示。但是,如果一个值为空而一个值不是,结果是“相同的”?!我确信这两个值都是唯一标识符,并且还尝试将这两个值都转换为唯一标识符以确保绝对确定。正在比较的 2 个值来自具有不同排序规则的不同数据库。排序有什么区别吗?任何想法,将不胜感激。

select [result] = case when 
    [target].StaffID <> [source].StaffID then 'different' 
    else 'same' 
    end
from
    ...

如果我将 <> 替换为 =,则查询会认为 2 个空值不匹配。

编辑:

我用了:

declare @empty uniqueidentifier
set @empty = '00000000-0000-0000-0000-000000000000'
... isnull(somevalue, @emtpy) <> isnull(othervalue, @empty) ...
4

2 回答 2

2

NULL既不等于某物,也不等于无。通常,您会通过与 比较来检查空值IS NULL。例如,

somefield IS NULL

您可以考虑使用COALESCE您正在尝试做的事情 - 只要确保您使用相同的数据类型(在本例中为 UniqueIdentifier):

...
  case 
    when coalesce(t.StaffID,'00000000-0000-0000-0000-000000000000') <> 
         coalesce(t2.StaffID,'00000000-0000-0000-0000-000000000000')
    then 'different' 
    else 'same' 
  end
...

http://sqlfiddle.com/#!3/181e9d/1

于 2013-07-11T00:55:23.330 回答
0

null 更像是一个未知数,它不是一个真正的值。不幸的是,SQL 会告诉你 null = null 是假的。

基本上,您必须将空值转换为空字符串,而不是进行比较。我们使用 IFNULL(value, replacement) 来做到这一点......

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

希望这可以帮助。

select case when null = null then 'equal' else 'not equal' end

以上将是“不等于”

select case when ISNULL(null, '') = ISNULL(null, '') then 'equal' else 'not equal' end

这将是“平等的”

最后你的案子...

select [result] = case when 
    ISNULL([target].StaffID, '') <> ISNULL([source].StaffID, '') then 'different' 
    else 'same' 
    end
from
于 2013-07-11T00:49:15.907 回答