приведение к Integer не работает должным образом? - PullRequest
4 голосов
/ 17 декабря 2011

выполните их и проверьте результат, почему это так?

declare @a decimal(8,3) =235.363
declare @b int          =1

select case @b
            when 1 then cast(@a as int)
            when 2 then CAST(@a as decimal(8,3))
end

Result  : 235.000

declare @a decimal(8,3) =235.363
declare @b int          =1

select case @b
            when 1 then cast(@a as int)
            --when 2 then CAST(@a as decimal(8,3))
end

Result  : 235

declare @a decimal(8,3) =235.363
declare @b int          =1

select case @b
            when 1 then cast(@a as tinyint)
            when 2 then CAST(@a as float)
end

Result : 235

Ответы [ 4 ]

2 голосов
/ 17 декабря 2011

Это поведение задокументировано в записи BOL для CASE

Типы возврата

Возвращает тип с наивысшим приоритетом из набора типов в result_expressions и необязательный else_result_expression. Для большего см. Приоритет типа данных (Transact-SQL) .

Если вы перейдете по ссылке на приоритет типа данных, вы увидите, что float имеет более высокий приоритет, чем decimal, что, в свою очередь, имеет более высокий приоритет, чем tinyint, поэтому ожидается такое поведение.

2 голосов
/ 17 декабря 2011

То, что вы видите, не то, что вы получаете.

Для столбца type SQL Server выбирает правильный более широкий тип (float over tinyint, decimalболее int).Вы можете проверить это, выполнив select into вместо простого выбора.

Это просто другие правила отображения.
Когда выбран тип столбца float, вы не можетене видно завершающего .000, когда нет дробной части.
Для decimal с установленными явными позициями, например decimal(8,3), вы увидите завершающий .000, даже если нет дробной части.Если вы удалите спецификатор и оставите только decimal в качестве типа столбца, .000 исчезнет.

Все, что не влияет на фактический тип столбца, который всегда является самым широким.

0 голосов
/ 17 декабря 2011

Преобразование в целое число не работает должным образом.

Ваше утверждение неверно!

В выражении CASE вы можете вернуть только один тип данных,так что согласно вашему утверждению вы можете вернуть либо INT, либо decimal(8,3), поскольку в вашем выражении case есть decimal(8,3), поэтому здесь INT данные неявно преобразуются в десятичную! Пожалуйста, смотрите пример ниже: , всегда пытайтесь использовать один и тот же тип возврата в выражении CASE, чтобы получить правильный и ожидаемый результат, спасибо.

1.

select case @b
    when 1 then CAST(@a as int) -- return type INT
when 2 then CAST(@a as int) -- return type INT
end

2.

select case @b
     when 1 then CAST(@a as int) -- return type INT and then converted to decimal(8,3)
 when 2 then CAST(@a as decimal(8,3)) -- return type return type INT 
end
0 голосов
/ 17 декабря 2011

Вероятно, операция приведения приведет к приведению всех параметров к большему типу.

Из MSDN:

Типы данных input_expression и каждый случай when_expression должны быть одинаковыми или должны бытьнеявное преобразование.

http://msdn.microsoft.com/en-us/library/ms181765.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...