Wyobraź sobie, że chcesz dodać do siebie dwie liczby, ale jeden z parametrów jest zapisany jako string. Albo na przykład chcesz filtrować dane po roku, ale data jest u ciebie zapisana w pełnym formacie z godziną. PostgreSQL raczej nie będzie zadowolony z takiego pomysłu i będziesz musiał sam ogarnąć konwersję do odpowiedniego typu.
Konwersja typów pomaga:
- Uprościć przetwarzanie danych, żeby można było ich użyć w obliczeniach.
- Stworzyć bardziej czytelne i uporządkowane dane do eksportu lub analizy.
- Eliminować błędy związane z niezgodnością typów danych.
Podstawy konwersji typów danych: CAST() i ::
1. CAST() — starszy brat każdej konwersji
Funkcja CAST() to taki "oficjalny" sposób na konwersję wartości z jednego typu danych na inny. Działa jak uniwersalny tłumacz.
Składnia:
CAST(wartość AS docelowy_typ_danych)
Przykład 1: Konwersja stringa na liczbę.
SELECT CAST('123' AS INTEGER); -- Wynik: 123
Przykład 2: Konwersja liczby na stringa.
SELECT CAST(123 AS TEXT); -- Wynik: '123'
Przykład 3: Konwersja daty na stringa.
SELECT CAST(NOW() AS TEXT); -- Wynik: '2023-10-25 15:00:00.000000'
2. Operator :: — zwięzła alternatywa
Jeśli CAST() wydaje ci się trochę rozwlekły, PostgreSQL ma też składnię ::. To skrócony sposób konwersji, mega popularny przez swoją prostotę.
Składnia:
wartość::docelowy_typ_danych
Przykład 1: Konwersja stringa na liczbę.
SELECT '123'::INTEGER; -- Wynik: 123
Przykład 2: Konwersja liczby na stringa.
SELECT 123::TEXT; -- Wynik: '123'
Przykład 3: Konwersja daty na stringa.
SELECT NOW()::TEXT; -- Wynik: '2023-10-25 15:00:00.000000'
Prawdziwe przykłady użycia konwersji typów
1. Konwersja liczb i stringów
Załóżmy, że masz tabelę students, gdzie kolumna student_id jest przechowywana jako string, ale chcesz ją porównać z wartością liczbową. Bez konwersji nic z tego nie będzie.
| student_id | first_name | last_name | birth_date | grade |
|---|---|---|---|---|
| 101 | Alex | Lin | 2008-03-15 | 9 |
| 102 | Maria | Chi | 2009-07-22 | 8 |
| 103 | Axel | Ivy | 2007-11-30 | 10 |
| 104 | Nat | Sok | 2008-01-18 | 9 |
| 105 | Pol | Frez | 2009-05-05 | 8 |
Dlatego w zapytaniu trzeba jawnie przekonwertować kolumnę student_id na liczbę:
SELECT *
FROM students
WHERE student_id::INTEGER = 101;
Analogiczne zapytanie z użyciem CAST():
SELECT *
FROM students
WHERE CAST(student_id AS INTEGER) = 101;
Konwersja dat
Kiedy trzeba wyciągnąć część daty albo przekonwertować ją na stringa, konwersja typów też się przydaje. Na przykład masz tabelę courses z datami rozpoczęcia kursów w kolumnie start_date.
| course_id | course_name | start_date |
|---|---|---|
| 1 | Wprowadzenie do Python | 2025-01-15 |
| 2 | Podstawy SQL | 2025-03-01 |
| 3 | Analiza danych | 2025-05-10 |
| 4 | Web-rozwoj | 2025-06-20 |
| 5 | Uczenie maszynowe | 2025-09-05 |
Przykład: Wyciągnij rok jako liczbę.
SELECT start_date::DATE, start_date::TEXT, start_date::TIMESTAMP
FROM courses;
Wynik będzie taki:
| start_date (DATE) | start_date (TEXT) | start_date (TIMESTAMP) |
|---|---|---|
| 2025-01-15 | 2025-01-15 | 2025-01-15 00:00:00 |
| 2025-03-01 | 2025-03-01 | 2025-03-01 00:00:00 |
| 2025-05-10 | 2025-05-10 | 2025-05-10 00:00:00 |
| 2025-06-20 | 2025-06-20 | 2025-06-20 00:00:00 |
| 2025-09-05 | 2025-09-05 | 2025-09-05 00:00:00 |
Przykład: Konwertuj datę na "czysty string".
SELECT TO_CHAR(start_date, 'DD-MM-YYYY')
Wynik będzie taki:
| to_char |
|---|
| 15-01-2025 |
| 01-03-2025 |
| 10-05-2025 |
| 20-06-2025 |
| 05-09-2025 |
Błąd: Kiedy konwersja się sypie?
Sztuczka z konwersją danych nie zawsze działa. Czasem PostgreSQL jasno daje znać, że "nie kuma" twoich intencji. Klasyczny przykład: próbujesz przekonwertować tekst, który wygląda jak liczba, ale w środku są niepotrzebne znaki.
Przykład błędu:
SELECT '123abc'::INTEGER;
-- BŁĄD: invalid input syntax for type integer: "123abc"
Żeby uniknąć takich akcji, upewnij się, że dane naprawdę da się przekonwertować na docelowy typ wcześniej. Możesz na przykład użyć wyrażeń regularnych albo dodatkowych sprawdzeń.
GO TO FULL VERSION