CodeGym /Kurse /SQL SELF /Datentypumwandlung mit CAST() und :: — Beispiele und Beso...

Datentypumwandlung mit CAST() und :: — Beispiele und Besonderheiten

SQL SELF
Level 5 , Lektion 3
Verfügbar

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.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION