#sql-server #tsql
#sql-server #tsql
Вопрос:
У меня есть следующий код, и когда я ожидал, что он не попадет в блок if, он попал. Унаследованный код, поэтому я предпочитаю игнорировать оригинальную идею программистов о смешивании типов данных — поэтому я очень стараюсь отложить в сторону вопрос о качестве кода.
Declare @computedValue int
set @computedValue = 0
if(@computedValue = '')
Begin
select 'its empty'
End
Почему это выводит «его пустой», когда я устанавливаю значение @computedValue
равным нулю, которое явно не является «?
Странно то, что если я установлю для нее какое-то число, отличное от нуля, оно не войдет в if .
Фактическое назначение @computedValue
:
select @computedValue = case when Block_Value is null or Block_Value = '' then null else Block_Value end
Комментарии:
1. Рекомендуемое чтение: приоритет типа данных .
2. @DaleK Да, я делаю. Последний абзац преобразования символьных данных начинается со слов: «Когда пустая строка преобразуется в an
int
, ее значение становится0
» . (Хорошо, это заняло менее пяти минут кражи, но теперь я знаю, где это официально заявлено.)
Ответ №1:
Потому что select convert(int, '')
возвращает 0
— это одно из многих автоматических преобразований типов, выполняемых SQL Server. Вот как вы можете справиться с вашей ситуацией:
declare @Block_Value varchar(12) = '';
declare @computedValue int;
set @computedValue = 0;
-- select @computedValue = case when Block_Value is null or Block_Value = '' then null else Block_Value end
select @computedValue = nullif(@Block_Value,'');
if @computedValue is null
begin
select 'its empty';
end;
Кроме того, приоритет типа данных объясняет, почему пустая строка преобразуется в an int
в вашем сравнении (а не наоборот).