десятичное форматирование sql server в строке запроса

#sql-server-2005 #number-formatting

#sql-server-2005 #форматирование чисел

Вопрос:

Я нашел несколько решений в Интернете, но ни одно из них не действительно делает то, что я ищу. Итак, вот так..
В моей таблице есть несколько столбцов типа numeric (8, 4), numeric (8, 5) и т.д., И когда я извлекаю данные, они идут со всеми конечными 0. Есть ли способ, которым я могу отформатировать его так, чтобы в нем отсутствовали все конечные и начальные 0? Я не хочу указывать длину точности. Вот несколько примеров того, что я ищу:

 145.5000 -> 145.5
145.6540 -> 145.654
73.4561 -> 73.4561
37.0000 -> 37
  

Большое вам спасибо!

Комментарии:

1. нужно ли его преобразовывать в SQL statment? разве вы не можете управлять этим с помощью своего языка программирования

2. Я мог бы.. но, похоже, это было бы намного более утомительно

3. просто дождитесь ответов, но SQL не имеет специфических функций, которые есть в языках программирования.

4. @Luis word. и вот оно! лол

Ответ №1:

Float и real являются приблизительными типами данных, поэтому это может работать не с каждым значением, с которым вы сталкиваетесь. Учитывая, что у вас есть только 4 или 5 цифр точности, я думаю, что этот метод всегда будет работать, но вы захотите хорошенько протестировать его, прежде чем внедрять в производство.

 DECLARE @d DECIMAL(8,5)

select @d = 5.12030

Select Convert(Float, @d)
  

Ответ №2:

В идеале вы хотите сделать это во внешнем коде

итак, как вы будете различать 0.37 и 37.0 , если все, что вам нужно, это 37 ?

Вот один из способов в SQL

Замените 0 пробелом и выполните обрезку, а затем замените пробел обратно на 0

пример

редактировать: пропустил конечную точку раньше .. добавил это как оператор case

 DECLARE @d DECIMAL(8,5)
select @d = 5.12030

SELECT CASE WHEN RIGHT(REPLACE(RTRIM(LTRIM(REPLACE(CONVERT(VARCHAR(100),@d),'0',' '))),' ','0'),1) = '.'
THEN REPLACE(REPLACE(RTRIM(LTRIM(REPLACE(CONVERT(VARCHAR(100),@d),'0',' '))),' ','0'),'.','')
ELSE
REPLACE(RTRIM(LTRIM(REPLACE(CONVERT(VARCHAR(100),@d),'0',' '))),' ','0') END
  

Комментарии:

1. Спасибо за ответ. Очень сложный, я не думал, что потребуется так много манипуляций с данными. Возможно, было бы лучше сделать это в коде

2. Я бы хотел, чтобы функция ROUND () просто принимала число и предоставляла возможность не указывать длину: x

3. Что за монстр! 🙂 Почему бы не использовать подвыбор? Тогда вы могли бы избежать повторения всех этих вложенных функций.