Я знаю, что это могло быть сделано тривиально в среде не-SQL [постобработка данных, frontend, что имеет Вас], но это не возможно в данный момент. Есть ли способ взять a decimal(5,2)
и преобразуйте его в a varchar
без запаздывания обнуляет/десятичным точки? Например:
declare @number decimal(5,2)
set @number = 123.00
select cast(@number as varchar) as FormattedNumber
И результат '123.00'. Существует ли (простой) способ добраться '123' вместо этого? И аналогично, вместо '123,30', '123.3'? Мог сделать это путем выяснения, были ли места сотых частей/десятых частей 0 и вручную обрезка символов, но я хотел знать, было ли более изящное решение.
А как же:
SELECT CAST(CAST(@number AS float) AS varchar(10))
Однако сначала вы, возможно, захотите тщательно протестировать это с вашими необработанными данными.
Этот путь довольно прост:
DECLARE @Number DECIMAL(5,2)
SELECT @Number = 123.65
SELECT FormattedNumber = CAST(CAST(@Number AS DECIMAL(3,0)) AS VARCHAR(4))
возвращает «124».
Единственное, что нужно рассмотреть, является ли вы раунд вверх / вниз или просто разделите нули и десятичные точки без округления; Вы бы бросили десятичное значение, как int во втором случае.
Функция конвертации может делать то, что вы хотите сделать.
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/a87d0850-c670-4720-9ad5-6f5a22343ea8.htm
Вы можете разделить конечные нули в цикле :
declare @number decimal(5,2)
declare @str varchar(100)
set @number = 123.00
set @str = @number
while substring(@str,len(@str),1) in ('0','.',',')
set @str = substring(@str,1,len(@str)-1)
Но как прокомментировал Адатеду, это проще говорят на стороне клиента.
Простой и элегантный? Не так много ... Но это T-SQL для вас:
DECLARE @number decimal(5,2) = 123.00
DECLARE @formatted varchar(5) = CAST(@number as varchar)
SELECT
LEFT(
@formatted,
LEN(@formatted)
- PATINDEX('%[^0.]%', REVERSE(@formatted))
+ 1
)
Позвольте мне попробовать это снова ....
CREATE FUNCTION saneDecimal(@input decimal(5,2)) returns varchar(10)
AS
BEGIN
DECLARE @output varchar(10)
SET @output = CAST(@input AS varchar(10))
DECLARE @trimmable table (trimval char(1))
INSERT @trimmable VALUES ('0')
INSERT @trimmable VALUES ('.')
WHILE EXISTS (SELECT * FROM @trimmable WHERE trimval = CAST(SUBSTRING(@output, LEN(@output), 1) AS char(1)))
SET @output = LEFT(@output, LEN(@output) - 1)
RETURN @output
END
GO
SELECT dbo.saneDecimal(1.00)