es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.0000123456789
10^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?

Tags:  , ,

Answer

  1. Avatar for 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:

    CREATE TYPE num_flex6 AS (value numeric);
    

    Una vez que se crea el tipo de datos, puede utilizarlo como cualquier otro tipo de datos en PostgreSQL. Aquí hay algunos ejemplos:

    SELECT CAST(12.123456789 AS num_flex6); -- devuelve (12.123457,)
    SELECT ROW(12.123456789)::num_flex6; -- devuelve (12.123457,)
    SELECT (ROW(12.123456789)::num_flex6).value; -- devuelve 12.123457
    

    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.

Comments are closed.