2013-07-11 3 views
1

Я пытаюсь сравнить 2 уникальных значения идентификатора, как показано в следующем запросе. Однако, если одно значение равно null, а одно значение - нет, результат будет «одинаковым» ?! Я уверен, что оба значения являются уникальными идентификаторами, и также попытались сделать оба значения уникальным идентификатором, чтобы сделать абсолютно уверенным. Сравнение двух значений происходит из разных баз данных с разными сопоставлениями. Сопоставлена ​​ли какая-либо разница? Любые идеи были бы хорошы.TSQL Сравнение двух значений uniqueidentifier не работает должным образом

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

Если я заменю <> с = запрос, то считает, что 2 нулевые значения не совпадают.

EDIT:

Я использовал:

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

ответ

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

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

Смежные вопросы