Там какой-либо простой путь состоит в том, чтобы отформатировать десятичные числа в T-SQL?

Я знаю, что это могло быть сделано тривиально в среде не-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 и вручную обрезка символов, но я хотел знать, было ли более изящное решение.

10
задан Ian Henry 27 January 2010 в 22:15
поделиться

6 ответов

А как же:

SELECT CAST(CAST(@number AS float) AS varchar(10))

Однако сначала вы, возможно, захотите тщательно протестировать это с вашими необработанными данными.

14
ответ дан 3 December 2019 в 20:04
поделиться

Этот путь довольно прост:

DECLARE @Number DECIMAL(5,2)

SELECT @Number = 123.65

SELECT FormattedNumber = CAST(CAST(@Number AS DECIMAL(3,0)) AS VARCHAR(4))

возвращает «124».

Единственное, что нужно рассмотреть, является ли вы раунд вверх / вниз или просто разделите нули и десятичные точки без округления; Вы бы бросили десятичное значение, как int во втором случае.

4
ответ дан 3 December 2019 в 20:04
поделиться

Функция конвертации может делать то, что вы хотите сделать.

ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/a87d0850-c670-4720-9ad5-6f5a22343ea8.htm
0
ответ дан 3 December 2019 в 20:04
поделиться

Вы можете разделить конечные нули в цикле :

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)

Но как прокомментировал Адатеду, это проще говорят на стороне клиента.

0
ответ дан 3 December 2019 в 20:04
поделиться

Простой и элегантный? Не так много ... Но это 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
    )
0
ответ дан 3 December 2019 в 20:04
поделиться

Позвольте мне попробовать это снова ....

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)
0
ответ дан 3 December 2019 в 20:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: