2013-07-11 64 views
1

我試圖比較2 uniqueidentifier值,如下面的查詢中所示。但是,如果一個值爲空,而一個值不是,則結果是'相同'?!我確定這兩個值都是唯一標識符,並且也嘗試將這兩個值都賦值給uniqueidentifier以絕對確定。所比較的兩個值來自不同數據庫,具有不同的排序規則。排序規則有什麼區別?任何想法,將不勝感激。TSQL比較2 uniqueidentifier值不按預期方式工作

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) ... 

回答

2

NULL既不等於也不等於一無所有。通常你會通過與IS NULL比較來檢查空值。例如,

somefield IS NULL 

你可以考慮使用COALESCE你正在試圖做什麼 - 只要確保你使用相同的數據類型(在這種情況下,唯一標識符):

... 
    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

0

空更是一個未知的,它不是一個真正的價值。不幸的是,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 
+1

如果StaffId的類型是'UniqueIdentifier',那麼不能使用帶空字符串的'ISNULL' - 你會得到一個數據類型轉換錯誤。 – user2480596

相關問題