SQL Server: ISNULL на uniqueidentifier
Я пытаюсь сравнить столбец col1
и переменной @myvar
на WHERE
предложения. Оба обычно содержат GUID, но также могут иметь значения NULL.
Я думал, что смогу обойти тот факт, что NULL=NULL
оценивает значение FALSE с помощью WHERE ISNULL(col1, '')=ISNULL(@myvar, '')
. Вместо этого можно сравнить две пустые строки и вычислить значение TRUE.
это, однако, приведет к следующему сообщению об ошибке:
Msg 8169, Уровень 16, состояние 2, Ошибка преобразования строки 3 при преобразовании из строка символов в uniqueidentifier.
пробовал
DECLARE @myvar uniqueidentifier = NULL
SELECT ISNULL(@myvar,'') as col1
такое же сообщение об ошибке.
два вопроса: Во - первых, я пытаюсь преобразовать переменную uniqueidentifier - даже если она имеет нулевое значение-в (пустой!) строка, а не наоборот, как следует из сообщения об ошибке. Что происходит?
во-вторых, есть ли лучший способ сказать, что предложение WHERE мне нужно, чтобы позволить сравнивать uniqueidentifiers, которые могут быть NULL?
5 ответов
С первого аргумента вы передаете isnull
не литерал null
, он определит тип возврата этого вызова, a uniqueidentifier
в вашем случае. Второй аргумент:''
, не может быть приведен к этому типу, отсюда и ошибки вы получаете.
один из способов обойти это, чтобы явно проверить null
s:
WHERE (@myvar IS NULL AND col1 IS NULL) OR (col1 = @myvar)
Я думаю, что ниже выражение можно использовать, чтобы проверить, пуст ли столбец GUID
CAST(0x0 AS UNIQUEIDENTIFIER)
что-то типа
...WHERE GuidId <> CAST(0x0 AS UNIQUEIDENTIFIER)
причина ISNULL
не работает для вас в том, что значение замены (значение, которое будет использоваться, если выражение проверки действительно равно null) должно быть неявно конвертируемым в тип выражения проверки.
код WHERE
предложение может использовать col IS NULL AND @var IS NULL
чтобы проверить это состояние.
как указывали другие, исключите значения NULL из результатов, а затем выполните сравнение. Можно использовать COALESCE для исключения значений NULL из сравнений.