Stell dir vor, du willst zwei Zahlen addieren, aber einer der Parameter ist als String gespeichert. Oder du willst nach Jahr filtern, aber dein Datum ist komplett mit Uhrzeit gespeichert. PostgreSQL ist davon nicht so begeistert und du musst eingreifen, um die Daten in den richtigen Typ zu bringen.
Typumwandlung hilft dir dabei:
- Die Daten einfacher zu verarbeiten, damit du sie in Berechnungen nutzen kannst.
- Lesbarere und strukturiertere Daten für Export oder Analyse zu erstellen.
- Fehler zu vermeiden, die durch Typinkompatibilität entstehen.
Grundlagen der Datentypumwandlung: CAST() und ::
1. CAST() — der große Bruder jeder Umwandlung
Die Funktion CAST() ist der "offizielle" Weg, Werte von einem Datentyp in einen anderen zu konvertieren. Sie funktioniert wie ein universeller Übersetzer.
Syntax:
CAST(wert AS ziel_datentyp)
Beispiel 1: String in Zahl umwandeln.
SELECT CAST('123' AS INTEGER); -- Ergebnis: 123
Beispiel 2: Zahl in String umwandeln.
SELECT CAST(123 AS TEXT); -- Ergebnis: '123'
Beispiel 3: Datum in String umwandeln.
SELECT CAST(NOW() AS TEXT); -- Ergebnis: '2023-10-25 15:00:00.000000'
2. Operator :: — die knackige Alternative
Wenn dir CAST() zu wortreich ist, bietet PostgreSQL den ::-Syntax an. Das ist die Kurzform, die wegen ihrer Kürze sehr beliebt ist.
Syntax:
wert::ziel_datentyp
Beispiel 1: String in Zahl umwandeln.
SELECT '123'::INTEGER; -- Ergebnis: 123
Beispiel 2: Zahl in String umwandeln.
SELECT 123::TEXT; -- Ergebnis: '123'
Beispiel 3: Datum in String umwandeln.
SELECT NOW()::TEXT; -- Ergebnis: '2023-10-25 15:00:00.000000'
Echte Beispiele für Typumwandlung
1. Zahlen und Strings umwandeln
Angenommen, du hast eine Tabelle students, in der die Spalte student_id als String gespeichert ist, aber du willst sie mit einem Zahlenwert vergleichen. Ohne Umwandlung klappt das nicht.
| 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 |
Deshalb musst du im Query die Spalte student_id explizit in eine Zahl umwandeln:
SELECT *
FROM students
WHERE student_id::INTEGER = 101;
Ähnlicher Query mit CAST():
SELECT *
FROM students
WHERE CAST(student_id AS INTEGER) = 101;
Datum-Umwandlung
Wenn du einen Teil des Datums extrahieren oder es in einen String umwandeln willst, hilft dir die Typumwandlung auch. Zum Beispiel hast du eine Tabelle courses mit Kursstartdaten in der Spalte start_date.
| course_id | course_name | start_date |
|---|---|---|
| 1 | Einführung in Python | 2025-01-15 |
| 2 | SQL Grundlagen | 2025-03-01 |
| 3 | Datenanalyse | 2025-05-10 |
| 4 | Web-Entwicklung | 2025-06-20 |
| 5 | Maschinelles Lernen | 2025-09-05 |
Beispiel: Das Jahr als Zahl extrahieren.
SELECT start_date::DATE, start_date::TEXT, start_date::TIMESTAMP
FROM courses;
Das Ergebnis sieht dann so aus:
| 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 |
Beispiel: Datum in einen "sauberen String" umwandeln.
SELECT TO_CHAR(start_date, 'DD-MM-YYYY')
Das Ergebnis sieht dann so aus:
| to_char |
|---|
| 15-01-2025 |
| 01-03-2025 |
| 10-05-2025 |
| 20-06-2025 |
| 05-09-2025 |
Fehler: Wann geht die Umwandlung schief?
Der Trick mit der Typumwandlung klappt nicht immer. Manchmal macht PostgreSQL ganz klar, dass es deine Absicht nicht "versteht". Hier ein Klassiker: Du versuchst, einen Text, der wie eine Zahl aussieht, umzuwandeln, aber im Text sind noch andere Zeichen.
Beispiel für einen Fehler:
SELECT '123abc'::INTEGER;
-- FEHLER: ungültige Eingabesyntax für Typ integer: "123abc"
Damit sowas nicht passiert, check vorher, ob die Daten wirklich in den Zieltyp umgewandelt werden können. Zum Beispiel kannst du reguläre Ausdrücke oder zusätzliche Checks nutzen.
GO TO FULL VERSION