#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. Что за монстр! 🙂 Почему бы не использовать подвыбор? Тогда вы могли бы избежать повторения всех этих вложенных функций.