Ограничение числа с плавающей запятой до 2 знаков после запятой в PostgreSQL 11.0 - PullRequest
0 голосов
/ 06 августа 2020

У меня есть следующая таблица в PostgreSQL 11.0

age
(null)
12 Months
2 Years
14 Months
7 Weeks
365 Days

Я применил регулярное выражение для извлечения чисел перед 'месяцами, годами, неделями' и преобразовал их в годы.

Текущий вывод выглядит следующим образом:

age              col1
(null)           (null)
12 Months        1
2 Years          2
14 Months        1.16666667
7 Weeks          0.13461538
365 Days         1

Используемый запрос приведен ниже:

alter table tbl1
create column col1;

update tbl

set col1 = case 
           when age ilike '%year%' then (regexp_match(age, '\d+'))[1]::float 
           when age ilike '%month%' then ( (regexp_match(age, '\d+'))[1]::float / 12) 
           when age ilike '%week%' then ( (regexp_match(age, '\d+'))[1]::float / 52)
           when age ilike '%day%' then ( (regexp_match(age, '\d+'))[1]::float / 365)
           else null
     end ;

Я хотел бы дополнительно ограничить десятичные разряды до 2 и округлить число. Тип данных col1 - float, и результирующий столбец тоже должен быть float. Ожидаемый результат (только col1):

col1
(null)
1
2
1.17
0.13
1

Любая помощь приветствуется !!

1 Ответ

0 голосов
/ 06 августа 2020
alter table tbl1
create column col1;

update tbl

set col1 = case 
           when age ilike '%year%' then (regexp_match(age, '\d+'))[1]::numeric(16,2)::float 
           when age ilike '%month%' then ( (regexp_match(age, '\d+'))[1]::float / 12)::numeric(16,2)::float  
           when age ilike '%week%' then ( (regexp_match(age, '\d+'))[1]::float / 52)::numeric(16,2)::float 
           when age ilike '%day%' then ( (regexp_match(age, '\d+'))[1]::float / 365)::numeric(16,2)::float 
           else null
     end ;

Можете попробовать это. Вы также можете использовать round(column_name::numeric, n)

...