Может ли значение формата «разделить» число в PostgreSQL?

#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. Я понимаю. Я пытался избежать дополнительной колонки для «делителя». Думаю, у меня нет выбора. Спасибо.