#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