TSQL比较2个uniqueidentifier值未按预期工作

时间:2013-07-11 00:41:47

标签: sql sql-server uniqueidentifier null-uniqueidentifier

我试图比较2个uniqueidentifier值,如下面的查询所示。但是,如果一个值为null且一个值不是,则结果是相同的?#!我确信这两个值都是uniqueidentifier,并且还尝试将这两个值都转换为uniqueidentifier以确保绝对正确。被比较的2个值来自具有不同排序规则的不同数据库。整理是否有任何区别?任何想法都将不胜感激。

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

如果我更换&lt;&gt;使用= =查询然后认为2个空值不匹配。

修改

我用过:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

null更多是未知的,它不是真正的价值。不幸的是,SQL会告诉你null = null是假的。

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

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