Sortowanie i formatowanie — to logiczne i przydatne. Ale czasem można się nieźle pogubić i dostać zaskakujące wyniki. Zobaczmy razem najczęstsze błędy, żeby Twoje dane zawsze wyglądały idealnie i były w odpowiedniej kolejności!
1. Sortowanie danych różnych typów
Wyobraź sobie sytuację: sortujesz tabelę po kolumnie, która zawiera mieszankę liczb i stringów. PostgreSQL oczywiście spróbuje Ci pomóc, ale wynik może Cię zaskoczyć. Na przykład masz tabelę, gdzie value to tekst:
| id | value |
|---|---|
| 1 | 10 |
| 2 | 2 |
| 3 | apple |
| 4 | 20 |
I piszesz zapytanie:
SELECT *
FROM mixed_data
ORDER BY value;
Oczekiwany wynik? Może: 2, 10, 20, apple? Nie, PostgreSQL sortuje stringi na podstawie porządku leksykalnego/alfabetycznego, więc wynik będzie: 10, 2, 20, apple.
Jak uniknąć błędu?
Jeśli wiesz, że Twoja kolumna tekstowa zawiera dane liczbowe, jawnie przekonwertuj je na liczbę przed sortowaniem:
SELECT * FROM mixed_data ORDER BY value::INT;
Teraz wynik będzie: 2, 10, 20.
Ale uważaj: jeśli w Twojej kolumnie pojawią się stringi, których nie da się przekonwertować na liczbę, zapytanie rzuci błąd!
2. Podanie kilku kolumn do sortowania
Jeden z typowych błędów — zapomnieć o kolejności priorytetów przy sortowaniu po kilku kolumnach. Na przykład, chcesz posortować studentów po nazwisku, a potem po wieku, ale pomyliłeś kolejność:
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 2 | Lin | 20 |
| 3 | Song | 19 |
Twoje zapytanie:
-- Zła kolejność sortowania
SELECT *
FROM students
ORDER BY age, last_name;
Wynik:
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 3 | Song | 19 |
| 2 | Lin | 20 |
W tym przypadku PostgreSQL najpierw posortuje studentów po wieku, a dopiero potem po nazwisku. Nie do końca o to chodziło, prawda?
Poprawne zapytanie:
SELECT *
FROM students
ORDER BY last_name, age;
Wynik:
| id | last_name | age |
|---|---|---|
| 1 | Lin | 18 |
| 2 | Lin | 20 |
| 3 | Song | 19 |
Teraz sortowanie najpierw idzie po nazwisku, a w ramach nazwiska — po wieku. Dokładnie tak, jak trzeba!
3. Sortowanie z różnymi kierunkami
Czasem trzeba zrobić sortowanie z różnymi kierunkami dla kolumn. Na przykład, posortować produkty po kategorii (rosnąco), a w ramach kategorii — po cenie (malejąco). Błąd pojawia się, jeśli zapomnisz podać kierunek dla drugiej kolumny:
| id | category | price |
|---|---|---|
| 1 | Electronics | 99.99 |
| 2 | Electronics | 199.99 |
| 3 | Furniture | 299.99 |
| 4 | Furniture | 199.99 |
Twoje zapytanie:
-- Zła kolejność sortowania
SELECT *
FROM products
ORDER BY category, price;
Wynik: ceny w ramach kategorii są posortowane rosnąco, a może chciałeś malejąco.
Poprawne zapytanie:
SELECT *
FROM products
ORDER BY category ASC, price DESC;
Błędy przy formatowaniu
4. Złe użycie CONCAT()
Załóżmy, że chcesz połączyć imię i nazwisko w jeden string, ale w pośpiechu zapominasz dodać separator między nimi:
| id | first_name | last_name |
|---|---|---|
| 1 | John | Doe |
| 2 | Jane | Smith |
Twoje zapytanie:
SELECT
CONCAT(first_name, last_name) AS full_name
FROM employees;
Wynik:
| full_name |
|---|
| JohnDoe |
| JaneSmith |
Jak to poprawić?
Dodaj spację między imieniem a nazwiskiem:
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;
Teraz wszystko wygląda dużo lepiej:
| full_name |
|---|
| John Doe |
| Jane Smith |
5. Błędy przy użyciu CAST()
Załóżmy, że próbujesz przekonwertować datę na string, żeby ładnie ją wyświetlić, ale zapominasz podać format:
| id | event_date |
|---|---|
| 1 | 2023-01-15 |
Twoje zapytanie:
-- Zła konwersja
SELECT
CAST(event_date AS TEXT)
FROM events;
Wynik: data zostanie przekonwertowana do formatu YYYY-MM-DD, co nie zawsze jest wygodne dla użytkowników.
Jak to poprawić?
Użyj funkcji TO_CHAR(), żeby podać format:
SELECT
TO_CHAR(event_date, 'DD-MM-YYYY') AS formatted_date
FROM events;
Teraz data będzie wyświetlana w formacie 15-01-2023.
6. Błędy przy użyciu DISTINCT
DISTINCT — potężne narzędzie do wyciągania unikalnych wartości, ale czasem jest używane źle. Na przykład, chcesz dostać listę unikalnych imion pracowników:
SELECT DISTINCT first_name, last_name
FROM employees;
Na pierwszy rzut oka zapytanie wygląda OK, ale jeśli dwóch pracowników ma takie samo imię i nazwisko, pojawią się jako jeden wynik, nawet jeśli to różne osoby.
Przykład danych:
| id | first_name | last_name |
|---|---|---|
| 1 | Alex | Lin |
| 2 | Maria | Chi |
| 3 | Alex | Lin |
Wynik zapytania:
| first_name | last_name |
|---|---|
| Alex | Lin |
| Maria | Chi |
Jak uniknąć błędu?
Dodaj klucz główny, żeby zagwarantować unikalność:
SELECT DISTINCT ON (id) first_name, last_name
FROM employees;
Wynik zapytania z DISTINCT ON (id):
| id | first_name | last_name |
|---|---|---|
| 1 | Alex | Lin |
| 2 | Maria | Chi |
| 3 | Alex | Lin |
Jak unikać błędów?
Praca z danymi wymaga uwagi do szczegółów. Żeby uniknąć powyższych błędów:
Sprawdzaj typy danych: upewnij się, że używane funkcje obsługują typy danych Twoich kolumn.
Sprawdzaj kolejność sortowania: upewnij się, że kolumny są podane w dobrej kolejności. Nie zapominaj o kierunkach sortowania ASC, DESC.
Testuj zapytania na małych próbkach danych: to pomoże wyłapać błędy na wczesnym etapie.
Nie zapominaj o dokumentacji PostgreSQL: ona pomoże odpowiedzieć na trudne pytania o funkcje i ich użycie. Tutaj link: oficjalna dokumentacja PostgreSQL.
Teraz jesteś gotowy na każdą zagadkę związaną z formatowaniem i sortowaniem! Lecimy dalej.
GO TO FULL VERSION