7 funciones épicas disponibles en PostgreSQL
martes, septiembre 13, 2016Só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
nombre | genero |
---|---|
El Diario de una Princesa | Comedia |
Guardianes de la Galaxia | Acción |
Juego de Gemelas | Drama |
Los Vengadores | Acción |
UP | Comedia |
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) |
---|---|---|
1 | El Diario de una Princesa | Comedia |
2 | Guardianes de la Galaxia | Acción |
3 | Juego de Gemelas | Drama |
4 | Los Vengadores | Acción |
5 | UP | Comedia |
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) |
---|---|---|
1 | Guardianes de la Galaxia | Acción |
2 | Los Vengadores | Acción |
1 | El Diario de una Princesa | Comedia |
2 | UP | Comedia |
1 | Juego de Gemelas | Drama |
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.
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