Ordenar e formatar — faz todo sentido e é super útil. Mas às vezes a gente se enrola e acaba tendo resultados bem esquisitos. Bora ver juntos os erros mais comuns pra garantir que seus dados sempre fiquem lindos e na ordem certa!
1. Ordenando dados de tipos diferentes
Imagina a situação: você tá ordenando uma tabela por uma coluna que mistura números e strings. O PostgreSQL até tenta te ajudar, mas o resultado pode te surpreender. Por exemplo, você tem uma tabela onde value é texto:
| id | value |
|---|---|
| 1 | 10 |
| 2 | 2 |
| 3 | apple |
| 4 | 20 |
E aí você manda esse SELECT:
SELECT *
FROM mixed_data
ORDER BY value;
O que você espera? Talvez: 2, 10, 20, apple? Nada disso, o PostgreSQL ordena strings pelo alfabeto, então o resultado vai ser: 10, 2, 20, apple.
Como evitar esse erro?
Se você sabe que sua coluna de texto tem números, converte pra número antes de ordenar:
SELECT * FROM mixed_data ORDER BY value::INT;
Agora o resultado vai ser: 2, 10, 20.
Mas fica ligado: se tiver alguma string que não vira número, o SELECT vai dar erro!
2. Ordenando por várias colunas
Um erro clássico é esquecer a ordem de prioridade quando ordena por mais de uma coluna. Tipo, você quer ordenar estudantes pelo sobrenome e depois pela idade, mas inverte a ordem:
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 2 | Lin | 20 |
| 3 | Song | 19 |
Seu SELECT:
-- Ordenação errada
SELECT *
FROM students
ORDER BY age, last_name;
Resultado:
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 3 | Song | 19 |
| 2 | Lin | 20 |
Nesse caso, o PostgreSQL primeiro ordena pela idade, depois pelo sobrenome. Não era bem isso que você queria, né?
O SELECT certo:
SELECT *
FROM students
ORDER BY last_name, age;
Resultado:
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 2 | Lin | 20 |
| 3 | Song | 19 |
Agora sim, primeiro ordena pelo sobrenome, depois pela idade dentro do sobrenome. Do jeitinho que você queria!
3. Ordenação com direções diferentes
Às vezes você precisa ordenar por colunas diferentes, cada uma com uma direção. Tipo, ordenar produtos por categoria (crescente) e dentro de cada categoria pelo preço (decrescente). O erro é esquecer de botar a direção na segunda coluna:
| id | category | price |
|---|---|---|
| 1 | Electronics | 99.99 |
| 2 | Electronics | 199.99 |
| 3 | Furniture | 299.99 |
| 4 | Furniture | 199.99 |
Seu SELECT:
-- Ordenação errada
SELECT *
FROM products
ORDER BY category, price;
Resultado: os preços dentro das categorias ficam em ordem crescente, mas talvez você queria em ordem decrescente.
O SELECT certo:
SELECT *
FROM products
ORDER BY category ASC, price DESC;
Erros de formatação
4. Usando CONCAT() do jeito errado
Imagina que você quer juntar nome e sobrenome numa string só, mas esquece de colocar um espaço entre eles:
| id | first_name | last_name |
|---|---|---|
| 1 | John | Doe |
| 2 | Jane | Smith |
Seu SELECT:
SELECT
CONCAT(first_name, last_name) AS full_name
FROM employees;
Resultado:
| full_name |
|---|
| JohnDoe |
| JaneSmith |
Como arrumar?
Coloca um espaço entre nome e sobrenome:
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;
Agora sim, fica bem mais bonito:
| full_name |
|---|
| John Doe |
| Jane Smith |
5. Erros usando CAST()
Imagina que você quer transformar uma data em string pra mostrar bonitinho, mas esquece de botar o formato:
| id | event_date |
|---|---|
| 1 | 2023-01-15 |
Seu SELECT:
-- Conversão errada
SELECT
CAST(event_date AS TEXT)
FROM events;
Resultado: a data vira YYYY-MM-DD, que nem sempre é o que o usuário quer ver.
Como arrumar?
Usa a função TO_CHAR() pra escolher o formato:
SELECT
TO_CHAR(event_date, 'DD-MM-YYYY') AS formatted_date
FROM events;
Agora a data aparece assim: 15-01-2023.
6. Erros usando DISTINCT
DISTINCT é super útil pra pegar valores únicos, mas às vezes a galera usa errado. Tipo, você quer uma lista de nomes únicos dos funcionários:
SELECT DISTINCT first_name, last_name
FROM employees;
Parece certo, mas se dois funcionários tiverem o mesmo nome e sobrenome, eles vão aparecer como um só, mesmo sendo pessoas diferentes.
Exemplo de dados:
| id | first_name | last_name |
|---|---|---|
| 1 | Alex | Lin |
| 2 | Maria | Chi |
| 3 | Alex | Lin |
Resultado do SELECT:
| first_name | last_name |
|---|---|
| Alex | Lin |
| Maria | Chi |
Como evitar esse erro?
Coloca a chave primária pra garantir que cada um é único:
SELECT DISTINCT ON (id) first_name, last_name
FROM employees;
Resultado do SELECT com DISTINCT ON (id):
| id | first_name | last_name |
|---|---|---|
| 1 | Alex | Lin |
| 2 | Maria | Chi |
| 3 | Alex | Lin |
Como evitar esses erros?
Trabalhar com dados exige atenção nos detalhes. Pra não cair nessas ciladas aí de cima:
Confere os tipos de dados: vê se as funções que você tá usando aceitam o tipo das suas colunas.
Confere a ordem de ordenação: garante que as colunas estão na ordem certa. Não esquece de botar ASC, DESC quando precisar.
Testa os SELECTs em tabelinhas pequenas: isso ajuda a pegar erro logo no começo.
Não esquece da documentação do PostgreSQL: ela salva vidas quando pinta dúvida sobre funções e como usar. Olha o link: doc oficial do PostgreSQL.
Agora você já tá pronto pra encarar qualquer mistério de formatação e ordenação! Bora pra próxima.
GO TO FULL VERSION