Пользовательское преобразование десятичного значения в sql

#sql #sql-server #database

#sql #sql-сервер #База данных

Вопрос:

Я должен настроить конкретное значение столбца запроса. где у меня есть четыре типа случаев, таких как

   empcode AbsentDays
  1       0.00
  6       0.50
  2       1.00
  3       1.50
  4       2.00
  5       2.50
  

и мой ожидаемый результат был бы таким

   1       0
  6       0.5
  2       1
  3       1.5
  4       2
  5       2.5
  

Чтобы сделать это, я попробовал это, написанное ниже

 AbsentDays = case 
                when AbsentDays = 0.00 
                   then convert(int, AbsentDays) 
                when AbsentDays >= 1.00 
                   then convert(decimal(10, 1), AbsentDays)
                -- when AbsentDays = 0.50 
                --    then 0.5
            end
  

Но, используя это, я не могу получить желаемый результат, он переопределяет другие значения.

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

1. Для одного столбца у вас может быть только один тип данных, в идеале вы должны делать это в пользовательском интерфейсе или изменить тип на varchar

2. 1 в пользовательском интерфейсе для этого; но плохая идея для varchar . Хранение десятичных знаков в виде varchar в будущем будет не чем иным, как проблемой.

Ответ №1:

Столбец может иметь только один тип данных. Чтобы увидеть различные случаи описанными вами способами, вам придется использовать varchar / nvarchar тип данных:

 AbsentDays = case 
                when AbsentDays = floor(AbsentDays)
                   then convert(nvarchar(max),convert(int, AbsentDays)) -- change to int if no decimal part
                else convert(nvarchar(max),convert(decimal(10, 1), AbsentDays)) -- else return one decimal
              end
  

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

1. Я бы проголосовал за, но вы используете символьный тип и не указываете длину.

2. И давайте не будем игнорировать запутанное использование «текстового типа данных», когда «строковый тип данных» был бы лучшим выбором, потому что ТЕКСТ — это тип данных.

3. Очень наблюдательный, я не очень к этому привык, спасибо. Я отредактирую соответствующим образом.

Ответ №2:

Не используйте значение с плавающей точкой, вы потеряете в точности.

 SELECT FORMAT(CAST(2.0 AS DECIMAL(9,6)), 'g15') -- will print 2
SELECT FORMAT(CAST(0.50 AS DECIMAL(9,6)), 'g15') -- will print 0.5
  

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

1. Обратите внимание, что format() доступен начиная с SQL Server 2012 и далее.

Ответ №3:

Вы можете сделать это, приведя его к float потому что крайние правые нули после десятичной точки обрезаются в float :

 select empcode, cast(AbsentDays as float)
from tbl
  

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

1. @ArnaudPeralta Нет, это не так. Какую СУБД вы используете? В SSMS это не выполняется подобным образом.

2. Это был пример, но float в целом плохи в базе данных. Вы легко найдете несколько примеров.

3. @ArnaudPeralta Пожалуйста, приведите действительный пример при попытке опровергнуть ответ. Я просто преобразовал 0.5 в float, и результат был 0.5

4. Попробуйте это: SELECT FORMAT(CAST(15.12 AS FLOAT), 'g17') . Странно оправдывать тот факт, что значение с плавающей точкой не является точным…

5. Я ничего не упомянул о format функции, которую вы используете. Просто попробуйте SELECT CAST(15.12 AS FLOAT) и увидите, что этого не происходит.