CodeGym /Kurse /SQL SELF /Vergleich und Umwandlung von Datentypen

Vergleich und Umwandlung von Datentypen

SQL SELF
Level 16 , Lektion 3
Verfügbar

Warum braucht man das überhaupt – Vergleich und Umwandlung von Typen? Stell dir vor, du hast in einer Tabelle einen String "42" und willst ihn mit der Zahl 42 vergleichen. Sieht erstmal gleich aus, oder? Aber für die Datenbank sind das komplett verschiedene Dinge. PostgreSQL wird nicht automatisch erraten, was du meinst. Und wenn du nicht verstehst, wie genau Werte verschiedener Typen verglichen werden, bekommst du vielleicht ein seltsames Ergebnis oder sogar einen Fehler.

Das Gleiche gilt für Umwandlungen. Manchmal musst du einen Text in eine Zahl verwandeln, um z.B. zu zählen, wie viele Stück von irgendwas es gibt. Oder umgekehrt – du willst eine Zahl hübsch als String anzeigen. Oder ein Datum nehmen und es als "01.01.2025" ausgeben, weil das für den User einfach gewohnter ist.

Noch ein Beispiel: Du hast einen genauen Wert im NUMERIC-Typ gespeichert, aber für wissenschaftliche Berechnungen brauchst du FLOAT. In solchen Fällen kommst du um eine explizite Umwandlung nicht herum.

Die gute Nachricht: PostgreSQL kann das alles ziemlich gut. Es gibt dir flexible und verständliche Tools für solche Aufgaben. Wichtig ist nur, zu wissen, wie man sie benutzt – und keine Angst zu haben, mal unter die Haube zu schauen. Genau das machen wir jetzt.

Vergleich von Datentypen

PostgreSQL versucht, schlau zu sein – wenn es sieht, dass z.B. INTEGER und NUMERIC verglichen werden, bringt es sie locker auf einen gemeinsamen Nenner und vergleicht sie. Das ist okay, denn beides sind Zahlen.

Aber wenn du versuchst, einen String mit einem Boolean (TEXT und BOOLEAN) zu vergleichen, weiß die Datenbank nicht, was du willst. Diese Typen sind einfach zu verschieden, und PostgreSQL wirft einen Fehler. Das Gleiche passiert, wenn du versuchst, den String "42" mit der Zahl 42 zu vergleichen, ohne explizit zu sagen, dass du den String in eine Zahl umwandeln willst.

Wie sieht das in der Praxis aus? Hier ein Beispiel, das einen Fehler auslöst:

SELECT '42' = 42; -- Fehler! String und Zahl werden ohne Umwandlung nicht verglichen

So klappt es dann richtig:

SELECT '42'::INTEGER = 42; -- TRUE

Hier sagen wir ganz klar: „Bitte, verwandle zuerst '42' in eine Zahl“. Dafür gibt es die ::Typ-Syntax, die wir schon erwähnt haben. PostgreSQL mag es, wenn man mit ihm deutlich spricht.

Vergleich von Zahlentypen

Zahlentypen (INTEGER, NUMERIC, REAL) sind meistens untereinander kompatibel, du kannst sie also ohne große Probleme vergleichen:

SELECT 42 = 42.0; -- TRUE
SELECT 42::REAL = 42.0; -- TRUE
SELECT 42.0::NUMERIC = 42; -- TRUE

Aber Vorsicht bei Fließkommazahlen (REAL). Wegen begrenzter Genauigkeit können sich solche Zahlen manchmal komisch verhalten. Zum Beispiel:

SELECT 0.1 + 0.2 = 0.3; -- FALSE

Ist das nicht das berühmteste Programmier-Rätsel? Hier gibt das Vergleichsergebnis FALSE zurück, weil Fließkommazahlen im Speicher speziell gespeichert werden.

Vergleich von Texttypen

Mit Texttypen kannst du CHAR, VARCHAR und TEXT vergleichen, weil PostgreSQL sie automatisch in kompatible Typen umwandelt:

SELECT 'Hello' = 'Hello'::TEXT; -- TRUE
SELECT 'World'::CHAR(5) = 'World'::VARCHAR; -- TRUE

Achte auf die Länge bei CHAR(n): Wenn der String kürzer als die angegebene Länge ist, füllt PostgreSQL ihn mit Leerzeichen auf.

Umwandlung von Datentypen

PostgreSQL bietet mehrere Wege, Datentypen umzuwandeln. Wir schauen uns die zwei wichtigsten Methoden an:

Methode Nr. 1: Explizite Umwandlung (CAST)

Mit dem CAST-Operator kannst du genau angeben, wie ein Typ in einen anderen umgewandelt werden soll. Beispiel:

SELECT CAST('42' AS INTEGER); -- Wandelt den String '42' in die Zahl 42 um

Das ist besonders praktisch, wenn du willst, dass dein SQL-Code lesbarer ist.

Methode Nr. 2: Kurzschreibweise (::)

PostgreSQL bietet eine alternative Syntax für Typumwandlungen – das ::. Das ist die gleiche Operation, nur kürzer geschrieben:

SELECT '42'::INTEGER; -- Das Gleiche wie CAST('42' AS INTEGER)

Automatische Umwandlung

In vielen Fällen wandelt PostgreSQL Daten automatisch um. Zum Beispiel, wenn du Zahlen in String-Feldern verwendest:

SELECT '42' = 42::TEXT; -- TRUE

Aber: Sich auf automatische Umwandlung zu verlassen, ist nicht immer sicher, weil das für andere Entwickler unerwartet sein kann. Gerade bei Datumswerten und Strings solltest du lieber explizit umwandeln.

Beispiele für die Umwandlung verschiedener Datentypen

Zahlen in Text umwandeln

Manchmal musst du Zahlen in Text umwandeln (z.B. für Nachrichten):

SELECT 42::TEXT; -- Wandelt die Zahl 42 in den String '42' um
SELECT 3.14::TEXT; -- Wandelt die Zahl 3.14 in den String '3.14' um

Text in Zahlen umwandeln

Wenn im String eine gültige Zahl steht, kannst du ihn in einen Zahlentyp umwandeln:

SELECT '123'::INTEGER; -- Wandelt den String '123' in die Zahl 123 um
SELECT '3.14'::FLOAT;  -- Wandelt den String '3.14' in die Zahl 3.14 um

Aber was passiert, wenn der Text nicht umgewandelt werden kann? Zum Beispiel:

SELECT 'Hello'::INTEGER; -- Fehler: Kann 'Hello' nicht in eine Zahl umwandeln

Um solche Fehler zu vermeiden, kannst du die Funktion TRY_CAST() (ab PostgreSQL 14) oder vorherige Datenprüfung nutzen.

Datum in Text und zurück umwandeln

Für Datumsumwandlungen kannst du die Funktionen TO_CHAR() und TO_DATE() verwenden:

SELECT TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD'); -- Wandelt das Datum in einen String um
SELECT TO_DATE('2023-10-25', 'YYYY-MM-DD'); -- Wandelt den String in ein Datum um

Umwandlung zwischen BOOLEAN und Text

Den logischen Datentyp BOOLEAN kannst du auch in Strings umwandeln:

SELECT TRUE::TEXT; -- 'true'
SELECT FALSE::TEXT; -- 'false'

Oder umgekehrt:

SELECT 'true'::BOOLEAN; -- TRUE
SELECT 'false'::BOOLEAN; -- FALSE

Achte darauf, dass Strings wie 'yes' oder 'no' nicht automatisch umgewandelt werden.

Praxis: alles an echten Beispielen

Wir erstellen eine Tabelle, die die Nutzung verschiedener Datentypen zeigt:

id number_as_text - TEXT number_as_integer - INTEGER date_as_text - TEXT actual_date - DATE
1 42 42 2023-10-25 2023-10-25
2 3.14 NULL 2023-10-24 NULL
3 Hello 123 NULL NULL

Jetzt führen wir Umwandlungs-Operationen aus:

-- Text in Zahl umwandeln
SELECT number_as_text::INTEGER FROM data_types_demo WHERE number_as_text = '42';

-- Datum in Text umwandeln
SELECT TO_CHAR(actual_date, 'DD/MM/YYYY') FROM data_types_demo;

-- String in Datum umwandeln
SELECT TO_DATE(date_as_text, 'YYYY-MM-DD') FROM data_types_demo;

Typische Fehler bei der Umwandlung von Daten

Typische Fehler sind zum Beispiel:

  1. Versuch, Daten umzuwandeln, die nicht dem erwarteten Format entsprechen (z.B. den String 'Hello' in INTEGER).
  2. Rundungs- und Genauigkeitsprobleme bei Fließkommazahlen.
  3. Falsche Formatangaben bei der Umwandlung von Datumswerten.

Um Fehler zu vermeiden, solltest du:

  • Daten immer vor der Umwandlung prüfen.
  • Fehlerbehandlungsfunktionen nutzen (TRY_CAST oder CASE).
  • Das Format bei Datumsumwandlungen immer explizit angeben.
-- Daten vor der Umwandlung prüfen
SELECT 
    CASE 
        WHEN number_as_text ~ '^\d+$' THEN number_as_text::INTEGER
        ELSE NULL
    END AS safe_integer
FROM data_types_demo;

Nutz diesen Ansatz, um deine Abfragen vor unerwarteten Situationen zu schützen!

Jetzt hast du die Basics drauf, um Datentypen in PostgreSQL zu vergleichen und umzuwandeln. Jetzt heißt es: üben, üben, üben. Bis zur nächsten Vorlesung!

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