2012-04-27 2 views
4

У меня есть одно поле таблицы базы данных, которое называется Amount, тип которого десятичен (18,6). поэтому она хранится в базе данных до 6 знаков после запятой, как 9.786534 Но при получении этого поля с помощью запроса на выборку я должен заботиться, как следующийУдалить конечный ноль из десятичного числа

  1. Снимите возможность проверки нулевой, например, если число 9,230000, то результат будет только 9,23
  2. Если десятичные точки равны нулю, то удалять только четыре пробных нуля, например, если число равно 9.000000, тогда результат равен 9,00

  3. Результат равен 2 десятичной точке, если есть пробная ноль.

Если мы напишем простой запрос, как

выберите TOP 1 Сумма От EmployeeMaster

то это дает 9,230000

но моя интенция, чтобы удалить последний ноль ..

Пожалуйста помогите мне ..

+1

Так вы имеете в виду, если у вас есть 9.234000, то он должен вернуть 3 знаков после запятой, то есть 9,234? – Marshal

+0

Возможный дубликат [Удалить конечные нули из десятичного числа в SQL Server] (http://stackoverflow.com/questions/2938296/remove-trailing-zeros-from-decimal-in-sql-server) – Farside

ответ

0

Это работает?

select TOP 1 ROUND(Amount, 2) From EmployeeMaster 
+0

Нет, я пробую это, но это не фактический результат, который мне нужен, потому что ROUND будет округлять ближайшее целое число, не удаляя пробный нуль .... –

0

TRY ниже упомянутый код.

SELECT TOP 1 CONVERT(DECIMAL(10,2),Amount) From EmployeeMaster 

Надеюсь, он будет работать должным образом.

1

Он работает для удаления завершающих нулей, но я до сих пор не могу преобразовать 9 в 9.00 в этот метод.

Declare @myvalue varchar(50), 
     @Price Varchar(50) 

Set @Price = '9.230000' 

set @Myvalue = reverse(substring(@Price,patindex('%.%',@Price)+1,len(@Price))) 


SELECT 
case 
When patindex('%.%[1-9]%',@price) = 0 Then 
    substring(@price,1,patindex('%.%',@price)-1) 
else 
    substring(@price,1,patindex('%.%',@price)-1) + '.' + Reverse(substring(@Myvalue,patindex('%[1-9]%',@Myvalue),len(@Myvalue))) 
END 
+1

Спасибо, что это ближайшее к моему фактическому результату .. –

1

Исходя из десятичных (18,6) можно сделать ...

select cast(Amount as decimal(18,2)) 

Большинством баз данных, которые поддерживают функцию CAST округляют числа при преобразовании его. На SQLServer это то, что я сделал бы, если бы захотел округлить.

Если то, что вы на самом деле хотите это строка, содержащая только две цифры после запятой, то вы могли бы

select cast((Amount as decimal(18,2)) as nvarchar) 

NVARCHAR является тип переменной длины юникода SQLServer в. Базы данных не очень согласуются с типами строк. У вашей базы данных может быть другая. Остальная часть этого стандарта является стандартом ANSI. Не все dbs поддерживают это, но многие делают это.

0

Альтернативный подход:

1) преобразовать десятичное в строку;

2) разделите строку на 2 части, отделяя последние 4 символа от остальной части строки;

3) удалить завершающие нули из последних 4 символов;

4) объединить две части назад.

WITH data (V)  AS (SELECT CAST(9.786534 AS decimal(18,6)) 
         UNION ALL 
         SELECT CAST(9.78653 AS decimal(18,6)) 
         UNION ALL 
         SELECT CAST(9.7800 AS decimal(18,6)) 
         UNION ALL 
         SELECT CAST(9.7  AS decimal(18,6)) 
         UNION ALL 
         SELECT CAST(9.00000 AS decimal(18,6)) 
        ) 

, AsString (V) AS (SELECT CAST(V AS varchar) FROM data) 

, Split (L, R) AS (SELECT LEFT(V, LEN(V) - 4), RIGHT(V, 4) FROM AsString) 

, Adjusted  AS (SELECT L, 
          REPLACE(RTRIM(REPLACE(R, '0', ' ')), ' ', '0') AS R 
         FROM Split) 

SELECT Result = L + R FROM Adjusted 

Выход выше сценария:

Result 
-------- 
9.786534 
9.78653 
9.78 
9.70 
9.00 
0

Я думаю, используя PATINDEX в вашем случае:

CASE WHEN FLOOR(Amount) <> CEILING(Amount) THEN 
    LTRIM(SUBSTRING(STR(Amount, 18, 6), 1, LEN(STR(Amount, 18, 6)) - PATINDEX('%[^0]%', REVERSE(str(Amount, 18, 6))) + 1)) 
    ELSE STR(Amount,18,2) 
END 
0

для decimal(18,6) поле это должно работать:

select trim(to_char(Amount, '999999999999999999.99')) from EmployeeMaster 

(по крайней мере, для Oracle, не уверен, о других типов)

1

Это должно работать

SELECT CAST(REPLACE(RTRIM(REPLACE(CAST(CAST(33.9082976 AS DECIMAL(38,8)) AS NVARCHAR(256)),'0',' ')),' ','0') AS FLOAT)