#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)
и увидите, что этого не происходит.