#sql #postgresql #number-formatting
Вопрос:
В одном из столбцов моей таблицы есть значения, которые обычно могут варьироваться от 3500 до 8 миллионов. Можно ли указать формат, который может делить число при форматировании?
Например, у меня есть следующие значения:
3500
81000
1678500
В идеале мне бы хотелось значение формата (взятое из другой таблицы конфигурации), которое форматировало бы числа в «тысячах» с 1 десятичным знаком:
3.5
81.0
1678.5
Но это значение формата также может отличаться для других случаев, поэтому они могут быть отформатированы в миллионах с двумя знаками после запятой:
0.00
0.08
1.68
Возможно ли это, или мне нужно самому разделить числа перед применением форматирования?
Комментарии:
1. «Формирование» — это не проблема базы данных, оставьте это на уровне представления, и пусть БД заботится о хранении. Числа сами по себе вообще не имеют присущего им формата.
2. Надеюсь, вы собираетесь поставить на нем показатель, иначе это как бы разрушит ваши данные?
3. @CaiusJard Да, я, надеюсь, хотел форматирования типа «[k]0,00 КБ», где «[k]» был делителем, но это было просто принятие желаемого за действительное. Спасибо.
Ответ №1:
Возможно ли это, или мне нужно самому разделить числа перед применением форматирования?
Вам нужно провести деление. Вы можете использовать СЛУЧАЙ, КОГДА, кстати, если у вас нет числовых значений, чтобы отслеживать, на что делить:
SELECT tablevalue / CASE divby WHEN 'thousand' THEN 1000 WHEN 'million' THEN 1000000 ELSE 1 END
Я предполагаю, что в вашей таблице «формат» будет какой-то столбец, в котором также указывается, на что делить..
Поэтому вы не хотите добавлять столбец.. вы можете сохранить информацию в существующем столбце.. вам просто нужно больше работать, чтобы вытащить это:
SELECT
TO_CHAR(
somenumber / CASE RIGHT(format, 1) WHEN 'k' THEN 1000 WHEN 'M' THEN 1000000 END,
LEFT(format, -1)
)
Итак, теперь вы можете сделать свой формат похожим 99D99k
, и k приведет к делению на 1000, и результат будет отформатирован до 99,99, так что, если у вас есть 1234
формат 9.99k
'1.23'
, вы выйдете из него.
Если вы хотите [k]
, чтобы в начале это было просто некоторое покачивание левой и ПРАВОЙ функций..
TO_CHAR(
somenumber / CASE LEFT(format, 3) WHEN '[k]' THEN 1000 WHEN '[M]' THEN 1000000 END,
RIGHT(format, -3)
)
Комментарии:
1. Я понимаю. Я пытался избежать дополнительной колонки для «делителя». Думаю, у меня нет выбора. Спасибо.