Trabajando con unidades de medida en PostgreSQL

En ocasiones necesitamos realizar algunas operaciones o  conversiones con unidades de medidas, lo cual puede ser un poco engorroso pues se tienen que hacer casteos, concatenaciones o fórmulas matemáticas, por ejemplo:

Tenemos un atributo que almacena el valor en bytes:

CREATE TABLE bytes (i int8);
INSERT INTO bytes VALUES(2000), (3000), (40000);

Necesitamos mostrar el valor en kB y además con la unidad de medidas, pues diran es simple, se castea a numeric,  se divide entre 1024, se redondea, se convierte a texto, y se concatena con ‘kB’

select round((i::numeric/1024),2)::text || 'kB' as en_Kb from bytes ;
en_kb
 ---------
 1.95kB
 2.93kB
 39.06kB
(3 rows)

Y si por casualidad se tiene almacenado el valor en texto como por ejemplo ‘1000 B’ como mil bytes, es un dolor de cabeza hacer la conversión, el casteo u operaciones matemáticas 😦

postgresql-unit al rescate

Recordando la destacada características de extensibilidad de PostgreSQL, existe una extensión desarrollada por Christoph Berg, la cual se puede descargar aquí, nos permite trabajar con las unidades de medidas y realizar operaciones con los valores, incluso con unidades distintas, por ejemplo kB+MB, sin  realizar muchas operaciones ni casteos ni conversión, pues ella se encarga de eso y así nuestra sintaxis SQL puede ser más limpia. Posee una serie de unidades base según el estándar para ellas, las cuales son:

  • meter (m), kilogram (kg), second (s), ampere (A), kelvin (K), mole (mol), candela (cd), byte (B)

Pues manos a la obra a ver que tal es su funcionamiento(se utilizó PostgreSQL 9.6, Centos7.2):

Una vez descargada del su sitio en github, puede que haya que instalar algunas dependecias(postgresql96-devel bison, flex) antes de compilarla es instalarla:


yum install postgresql96-devel  flex

yum install ftp://195.220.108.108/linux/fedora/linux/releases/24/Everything/x86_64/os/Packages/b/bison-3.0.4-4.fc24.x86_64.rpm

Una vez instalada las dependencias procedemos a compilar e instalar, puede que haya exportar en el PATH, el directorio de los binarios de PostgreSQL:

export PATH=$PATH:/usr/pgsql-9.6/bin/
make
make install

Ahora instalamos la extensión:

CREATE extension unit;
--el crea el tipo de dato unit
--suma de valores en bytes y retorna en kB
SELECT '800 B'::unit + '400 B' AS length;
length
--------
1.2 kB
(1 row)
--resultado de los bytes pero se muestra en MB con @
SELECT '800 B'::unit - '400 B' @ 'MB' AS length;
length
-----------
0.0004 MB
(1 row)
--utilizando el tipo de dato en un atributo de una tabla
CREATE TABLE unidades (i unit);
INSERT INTO unidades VALUES('2000 B'), ('3000 B'), ('40000 B');
--sumando el 1 MB al valor al atrbibuto de la tabla
 select  i + '1024 kB'  from unidades ;
suma
----------
1.026 MB
1.027 MB
1.064 MB
(3 rows)

Hasta el momento se ha mostrado el trabajo con bytes, pero puede hacerse con cualquier unidad base mencionada anteriormente, por ejemplo distancia(m):

SELECT '1000 m'::unit + '5000 cm' AS longitud;
longitud
----------
1.05 km
(1 row)

Que sencillo y limpio heeeee!!! 😀

Como pueden ver esta extensión puede ser útil para operar con unidades de medidas estándar, dejamos en sus manos utilizar la misma, que le puede ser beneficiosa para limpiar la sintaxis SQL de  sus consultas y falicitar el trabajo con unidades de medida.

Nos vemos en otra 😉

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s