SQL Server: удалить конечные 0 после десятичной точки.тип данных nvarchar - PullRequest
0 голосов
/ 11 декабря 2018

Я пишу SQL-запрос, возвращающий брутто-зарплату из двух отдельных таблиц.Суммы в обеих таблицах имеют тип данных nvarchar.В одной таблице у меня есть «150,0000», а в другой у меня есть «150», есть ли способ удалить трейлинг 0?Вот мой код

SELECT DISTINCT
    s.EEid,
    s.Gross AS 'S Gross',
    pr.EEid,
    pr.Gross AS 'PR Gross'
FROM 
    starPayHistory s
INNER JOIN 
    payRunPayHistory pr ON pr.EEid = s.EEid
ORDER BY 
    s.EEid

Результаты запроса

Results from query above

Я пробовал эту строку кода, чтобы обрезать ведущие 0, но возвращает «15».это удаляет все 0.

Вот код

REPLACE(ltrim(REPLACE(s.Gross,'0','')), ' ', '0') AS 'S Gross'

Результат из этой строки кода

Results from REPLACE

Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018
DECLARE @x as varchar(32) = '653710000.01';

--note rounding error occurs
select CAST(CAST(@x As FLOAT) AS NVARCHAR(32));

--how to break this one?
select 
        CASE WHEN PATINDEX('%[.]%',REVERSE(@x)) = PATINDEX('%[123456789.]%',REVERSE(@x)) 
            THEN 
                   LEFT(@x, LEN(@X) - PATINDEX('%[.]%',REVERSE(@x))) 
            ELSE  

                CASE WHEN PATINDEX('%[.]%',REVERSE(@x)) > 0 
                    THEN 
                        LEFT(@x, 1 + LEN(@X) - PATINDEX('%[123456789.]%',REVERSE(@x)))  
                    ELSE
                        @X
                    END
            END  ;
0 голосов
/ 11 декабря 2018

Я бы не рекомендовал преобразовывать в float, потому что это может привести к непредвиденным последствиям, поскольку float не является точным представлением.Вы можете просто использовать строковые операции.Например:

select (case when s.gross like '%.%'
             then replace(rtrim(replace(s.gross, '0', ' ')), ' ', '0')
             else s.gross
        end)

Например, попробуйте запустить this db <> fiddle .

0 голосов
/ 11 декабря 2018

Попробуйте это:

CAST(CAST(s.Gross As FLOAT) AS NVARCHAR(32))

Но если у вас есть контроль над таблицей, обратите внимание, что в нескольких комментариях к вашему вопросу говорится, что было бы лучше хранить как числовые.И не то, чтобы это использовало преимущество числовой работы с ним.Поэтому, если вы можете, подумайте об изменении типа на столе, и я согласен с другими, проблема просто исчезнет.

...