7 funciones épicas disponibles en PostgreSQL

martes, septiembre 13, 2016
Banner Épico

Sólo una geek (para no decir nerd porque suena menos cool) diría que una función de base de datos es épica XD, pero así soy yo, deje así, ya no hay nada que hacer por mí. Te presento hoy 7 funciones épicas disponibles en PostgreSQL que me han hecho la vida más fácil.

7. now()

Ésta función es sumamente básica, retorna la fecha y hora actual. Pero es tan útil y la uso con tanta frecuencia que tenía que estar si o si en esta entrada.

Ejemplo:

SELECT now() AS fecha_actual;
Resultado:
fecha_actual (timestamp with time zone)
2016-09-12 23:42:50.570371-04:30

6. COALESCE(value [, ...])

Retorna el primer valor que no sea null de una lista de valores (de no existir ninguno distinto retorna null). Lo interesante es que los valores de la lista pueden ser tanto campos de una tabla, como constantes ó sub-consultas.

Ejemplo:

SELECT COALESCE(null,1,2,3) AS no_nulo;
Resultado:
no_nulo (integer)
1

5. to_char(timestamp,text) ó (interval,text) ó (int,text) ó (double,text) ó (numeric, text)

Convierte el valor dado en un string, dándole además el formato deseado por medio de patrones de formato.

Ejemplo:

SELECT to_char('2016-09-12'::timestamp, 'dd/mm/YYYY') AS fecha_formateada;
Resultado:
fecha_formateada (text)
12/09/2016

4. age(timestamp) ó (timestamp, timestamp)

Nos retorna la diferencia en años, meses y días entre dos fechas. Si sólo le pasamos un parámetro hará la resta con la fecha actual.

Ejemplo:

SELECT age('2016-09-12'::timestamp,'2015-09-12'::timestamp) AS diferencia;
Resultado:
diferencia (interval)
1 year

3. generate_series(start, stop) ó (start, stop, step)

Genera una serie de elementos entre dos valores, pueden ser numéricos ó fecha/hora y se le puede pasar un tercer parámetro que indicará de cuanto en cuanto se hace el incremento. Por defecto se hace de uno en uno.

Ejemplo:

SELECT generate_series(1, 7, 2) AS serie;
Resultado:
serie (integer)
1
3
5
7

2. row_number()

Ésta función es una verdadera maravilla. Genera un correlativo "en vivo" de los resultados de una consulta. Además podemos indicarle un orden en específico por el cual hacer la numeración. De manera similar existe otra función llamada rank() que también asigna un número "en vivo" a cada registro según su posición, pero esta vez lo hace para la partición que le definamos.

Usaré ésta tabla para los siguientes ejemplos (basada en hechos reales XD):

Tabla: peliculas_favoritas
nombregenero
El Diario de una PrincesaComedia
Guardianes de la GalaxiaAcción
Juego de GemelasDrama
Los VengadoresAcción
UPComedia

Ejemplo row_number():

SELECT 
    row_number() OVER(ORDER BY nombre) AS correlativo, 
    nombre,
    genero 
FROM 
    peliculas_favoritas;
Resultado:
correlativo (bigint)nombre (character varying)genero (character varying)
1El Diario de una PrincesaComedia
2Guardianes de la GalaxiaAcción
3Juego de GemelasDrama
4Los VengadoresAcción
5UPComedia

Ejemplo rank():

SELECT 
    rank() OVER(PARTITION BY genero ORDER BY nombre) AS renglon,
    nombre,
    genero
FROM 
    peliculas_favoritas;
Resultado:
renglon (bigint)nombre (character varying)genero (character varying)
1Guardianes de la GalaxiaAcción
2Los VengadoresAcción
1El Diario de una PrincesaComedia
2UPComedia
1Juego de GemelasDrama

1. string_agg(text, text) ó (bytea, bytea)

Ésta última función se ha incorporado en las versiones más recientes de PostgreSQL, permite concatenar las filas resultantes de una consulta en una sola cadena, separada por el caracter que le indiquemos. Antes de saber de ella, tenía que hacer un procedimiento almacenado para conseguir los mismos resultados. Similares a ésta función existen éstas dos: array_agg() y json_agg().

Ejemplo:

SELECT 
    string_agg(nombre,',') AS nombres
FROM 
    peliculas_favoritas
ORDER BY nombre;
Resultado:
nombres (text)
El Diario de una Princesa,Guardianes de la Galaxia,Juego de Gemelas,Los Vengadores,UP

Espero que hayas encontrado útiles algunas de éstas funciones para emplearlas en tus consultas. Si conoces alguna otra función útil de PostgreSQL que uses con frecuencia, puedes dejarla en los comentarios, me encantaría conocerla.



También te puede interesar

Cuando navego por los sitios web, mi parte favorita es leer los comentarios. Es por eso que tus comentarios son un complemento valioso para mis entradas. Cualquier duda o aporte no dejes de escribirlo, en breve lo estaré publicando. ¡Gracias!


0 comentarios

Lo más reciente

¡Bendiciones para mi Venezuela!

¡Bendiciones para mi Venezuela!