как добавить конечный или начальный ноль к «0.1201» или » 01.00` всего 7 чисел в Postgresql

#sql #postgresql

Вопрос:

как добавить завершающий или ведущий ноль к 0.1201 7 числам или 1.00 всего 7 в Postgresql?

предположим, у меня есть данные ниже, и мы должны хранить числа в столбце varchar(и это не сломанный дизайн базы данных, у нас также есть некоторые значения 02.34×924 в этом столбце, не могли бы вы рассказать мне, как сохранить их в числовом или двойном формате)

 numbers
0.1201
 1.00 
26.25
02.34x924
 

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

 numbers
00.1201
01.0000 
26.2500
02.34x924
 

Я могу использовать ниже SQL, чтобы 26.25 равнялось 26.2500, но я не могу справиться с 0.1201 1.00

 select 
case when length(numbers) < 7 then rpad(numbers, 7, '0') else numbers end numbersnew
from mytable
 

Ответ №1:

Я бы разделил значение на две части, а затем добавил каждую часть отдельно.

 select concat(lpad(p1, 2, '0'), 
              '.', p2, 
              rpad('0', 4 - length(p2), '0'))
from (
  select trim(split_part(numbers, '.', 1)) as p1, 
         trim(split_part(numbers, '.', 2)) as p2 
  from my_table
) t  
 

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

Я бы поместил это в функцию, чтобы облегчить чтение ваших запросов:

 create function format_my_string(p_input text)
  returns text
as
$
select concat(lpad(p1, 2, '0'), 
              '.', p2, 
              rpad('0', 4 - length(p2), '0'))
from (
  select trim(split_part(p_input, '.', 1)) as p1, 
         trim(split_part(p_input, '.', 2)) as p2 
) t;
$
language sql
immutable;
 

Тогда используйте его вот так:

 select format_my_string(numbers)
from my_table