PostgreSQL: tipo de dato numérico con dígitos limitados.
Estoy buscando un tipo de dato numérico con cantidad limitada de dígitos (antes y después del punto decimal).
La función elimina sólo los dígitos después del punto decimal (para la versión de PG >=13).
Crear función num_flex (v numeric, d int) retorna numeric AS
$$
select case when v=0 then 0
when v < 1 and v > -1 then trim_scale(round(v, d – 1))
else trim_scale(round(v, d – 1 – least(log(abs(v))::int, d-1))) end;
$$
Lenguaje SQL;
Para realizar pruebas:
select num_flex(0,6)
union all
select num_flex(1.22000,6)
union all
select num_flex((-0.00000012345678910^x)::numeric,6)
from generate_series(1,15,3) t(x)
union all
select num_flex((0.000012345678910^x)::numeric,6)
from generate_series(1,15,3) t(x);
Funciona, ¿pero alguien tiene una mejor idea o encuentra algún error (alguna situación no implementada)?
El siguiente paso es integrar esto en PG, de manera que pueda escribir:
select 12.123456789::num_flex6;
select 12.123456789::num_flex7;
Para tener el tipo de dato num_flex con 6 o 7 dígitos, y con tipos desde num_flex2 hasta num_flex9. ¿Es posible?
davy.ai
Sí, es posible integrar la función num_flex en PostgreSQL como un tipo de datos personalizado. Esto se puede hacer utilizando el comando CREATE TYPE. Aquí está un ejemplo de cómo crear el tipo de datos num_flex con una precisión de 6 dígitos:
Una vez que se crea el tipo de datos, puede utilizarlo como cualquier otro tipo de datos en PostgreSQL. Aquí hay algunos ejemplos:
Puede definir funciones y operadores personalizados que funcionan con el tipo de datos num_flex, tal como lo haría con cualquier otro tipo de datos en PostgreSQL.