Ordenar y formatear — suena lógico y útil. Pero a veces puedes liarte sin querer y obtener resultados inesperados. ¡Vamos a repasar juntos los errores más comunes para que tus datos siempre se vean perfectos y estén en el orden correcto!
1. Ordenar datos de diferentes tipos
Imagínate esto: estás ordenando una tabla por una columna que tiene una mezcla de números y strings. PostgreSQL, claro, intentará ayudarte, pero el resultado puede sorprenderte. Por ejemplo, tienes una tabla donde value es texto:
| id | value |
|---|---|
| 1 | 10 |
| 2 | 2 |
| 3 | apple |
| 4 | 20 |
Y escribes la consulta:
SELECT *
FROM mixed_data
ORDER BY value;
¿Resultado esperado? ¿Quizá: 2, 10, 20, apple? Nope, PostgreSQL ordena los strings según el orden lexicográfico/alfabético, y el resultado será: 10, 2, 20, apple.
¿Cómo evitar el error?
Si sabes que tu columna de texto tiene datos numéricos, conviértelos explícitamente a número antes de ordenar:
SELECT * FROM mixed_data ORDER BY value::INT;
Ahora el resultado será: 2, 10, 20.
¡Pero ojo! Si en tu columna hay strings que no se pueden convertir a número, la consulta dará error.
2. Indicar varias columnas para ordenar
Un error típico es olvidarse del orden de prioridad al ordenar por varias columnas. Por ejemplo, quieres ordenar estudiantes por apellido y luego por edad, pero te confundes con el orden:
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 2 | Lin | 20 |
| 3 | Song | 19 |
Tu consulta:
-- Orden incorrecta
SELECT *
FROM students
ORDER BY age, last_name;
Resultado:
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 3 | Song | 19 |
| 2 | Lin | 20 |
En este caso, PostgreSQL primero ordena los estudiantes por edad y luego por apellido. No es exactamente lo que querías, ¿verdad?
Consulta correcta:
SELECT *
FROM students
ORDER BY last_name, age;
Resultado:
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 2 | Lin | 20 |
| 3 | Song | 19 |
Ahora la ordenación primero va por apellido, y dentro del apellido — por edad. ¡Justo lo que esperabas!
3. Ordenar con diferentes direcciones
A veces necesitas ordenar varias columnas con diferentes direcciones. Por ejemplo, ordenar productos por categoría (ascendente), y dentro de cada categoría — por precio (descendente). El error es olvidarse de indicar la dirección para la segunda columna:
| id | category | price |
|---|---|---|
| 1 | Electronics | 99.99 |
| 2 | Electronics | 199.99 |
| 3 | Furniture | 299.99 |
| 4 | Furniture | 199.99 |
Tu consulta:
-- Orden incorrecta
SELECT *
FROM products
ORDER BY category, price;
Resultado: los precios dentro de las categorías están ordenados de menor a mayor, pero quizá tú querías de mayor a menor.
Consulta correcta:
SELECT *
FROM products
ORDER BY category ASC, price DESC;
Errores al formatear
4. Uso incorrecto de CONCAT()
Supón que quieres juntar nombre y apellido en un solo string, pero con prisas te olvidas de poner un separador entre ellos:
| id | first_name | last_name |
|---|---|---|
| 1 | John | Doe |
| 2 | Jane | Smith |
Tu consulta:
SELECT
CONCAT(first_name, last_name) AS full_name
FROM employees;
Resultado:
| full_name |
|---|
| JohnDoe |
| JaneSmith |
¿Cómo arreglarlo?
Añade un espacio entre nombre y apellido:
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;
Ahora todo se ve mucho mejor:
| full_name |
|---|
| John Doe |
| Jane Smith |
5. Errores usando CAST()
Supón que intentas convertir una fecha a string para mostrarla bonito, pero te olvidas de indicar el formato:
| id | event_date |
|---|---|
| 1 | 2023-01-15 |
Tu consulta:
-- Conversión incorrecta
SELECT
CAST(event_date AS TEXT)
FROM events;
Resultado: la fecha se convierte al formato YYYY-MM-DD, que no siempre es cómodo para tus usuarios.
¿Cómo arreglarlo?
Usa la función TO_CHAR() para indicar el formato:
SELECT
TO_CHAR(event_date, 'DD-MM-YYYY') AS formatted_date
FROM events;
Ahora la fecha se muestra en formato 15-01-2023.
6. Errores usando DISTINCT
DISTINCT — es una herramienta potente para sacar valores únicos, pero a veces se usa mal. Por ejemplo, quieres obtener una lista de nombres únicos de empleados:
SELECT DISTINCT first_name, last_name
FROM employees;
A primera vista, la consulta parece correcta, pero si dos empleados tienen el mismo nombre y apellido, aparecerán como un solo resultado, aunque sean personas diferentes.
Ejemplo de datos:
| id | first_name | last_name |
|---|---|---|
| 1 | Alex | Lin |
| 2 | Maria | Chi |
| 3 | Alex | Lin |
Resultado de la consulta:
| first_name | last_name |
|---|---|
| Alex | Lin |
| Maria | Chi |
¿Cómo evitar el error?
Añade la clave primaria para garantizar la unicidad:
SELECT DISTINCT ON (id) first_name, last_name
FROM employees;
Resultado de la consulta con DISTINCT ON (id):
| id | first_name | last_name |
|---|---|---|
| 1 | Alex | Lin |
| 2 | Maria | Chi |
| 3 | Alex | Lin |
¿Cómo evitar errores?
Trabajar con datos requiere atención al detalle. Para evitar los errores de arriba:
Revisa los tipos de datos: asegúrate de que las funciones que usas soportan los tipos de tus columnas.
Revisa el orden de la ordenación: asegúrate de que las columnas están en el orden correcto. No olvides las direcciones de ordenación ASC, DESC.
Prueba las consultas con pequeños conjuntos de datos: así puedes pillar errores desde el principio.
No olvides la documentación de PostgreSQL: te ayudará a resolver dudas sobre funciones y su uso. Aquí tienes el enlace: docu oficial de PostgreSQL.
¡Ahora ya estás listo para enfrentarte a cualquier misterio de formateo y ordenación! Seguimos adelante.
GO TO FULL VERSION