Удаление начальных и конечных нулей вместе с делом - PullRequest
1 голос
/ 28 июня 2019

Я хотел удалить как начальные, так и конечные нули десятичной записи (например, имея 0,08 записи 0,0800).Это работает очень хорошо.

SELECT REPLACE(RTRIM(LTRIM(REPLACE(cast(CAST(0.0800 AS decimal(6,2)) as float),'0',' '))),' ','0') 

Однако, когда я пытаюсь использовать его с делом, он удаляет только завершающие нули.

DECLARE @char int = 1

SELECT  
CASE WHEN @char = 1 THEN REPLACE(RTRIM(LTRIM(REPLACE(cast(CAST(0.0800 AS decimal(6,2)) as float),'0',' '))),' ','0') 
ELSE 0.01
END 

дает 0,08, а я ожидаю получить 0,08.

Однако, этот дает 0.08

DECLARE @char int = 1

SELECT  
CASE WHEN @char = 1 THEN REPLACE(RTRIM(LTRIM(REPLACE(cast(CAST(0.0800 AS decimal(6,2)) as float),'0',' '))),' ','0') 
ELSE cast(cast(0.01 as decimal(6,2)) as varchar) 
END 

Кто-нибудь может объяснить причину?Мне просто интересно.

Ответы [ 2 ]

3 голосов
/ 28 июня 2019

С CASE (Transact-SQL) :

Возвращает тип с наивысшим приоритетом из набора типов в result_expressions и необязательное выражение else_result_expression.

И, как вы можете найти в Приоритет типа данных (Transact-SQL) любой числовой тип данных имеет более высокий приоритет, чем любой тип varchar, поэтому это:

CASE WHEN @char = 1 THEN REPLACE(RTRIM(LTRIM(REPLACE(cast(CAST(0.0800 AS decimal(6,2)) as float),'0',' '))),' ','0') 
ELSE 0.01
END

вернет тот же тип данных, что и 0.01.
Это означает, что хотя функция REPLACE() возвращает .08, она будет неявно преобразована в 0.08, и это то, что вы видите.
Во 2-й версии вашего запроса, где все ветви оператора CASE возвращают один и тот же тип данных, поскольку часть ELSE возвращает varchar, возвращаемый тип оператора равен varchar, поэтому вы видите, что ожидаете : .08

1 голос
/ 28 июня 2019

Это действительно относится к уровню представления.Тем не менее, существует альтернатива, в которой вы можете отформатировать число в виде строки.

Для ясности, format() имеет некоторые отличные функциональные возможности, но производительность может пострадать.

Пример

Select format(0.080,'#.######')

Возвращает

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