In PostgreSQL können Sie to_number()
verwenden Funktion zum Konvertieren einer Zeichenfolge in einen numerischen Wert.
Genauer gesagt wandelt es die Zeichenfolgendarstellung einer Zahl in einen numerischen Wert um.
Beispiel:Sie haben $1,234.50
als Zeichenfolge können Sie to_number()
verwenden um das in eine tatsächliche Zahl umzuwandeln, die numerisch verwendet Datentyp.
Syntax
Die Syntax lautet wie folgt:
to_number(text, text)
Wobei das erste Argument eine Zeichenfolgendarstellung der Zahl ist und das zweite Argument die Vorlage definiert, die das erste Argument verwendet.
Beispiel
Hier ist ein einfaches Beispiel zur Veranschaulichung.
SELECT to_number('80', '99');
Ergebnis:
80
In diesem Fall habe ich 99
verwendet als Vorlage. Jeweils 9
wird als „Schablonenmuster“ bezeichnet. Die 9
Vorlagenmuster repräsentiert eine Ziffernposition. Ich habe zwei verwendet, weil ich wollte, dass beide Ziffern enthalten sind.
Folgendes passiert, wenn ich einen der 9
entferne s.
SELECT to_number('80', '9');
Ergebnis:
8
Daher ist es wichtig, die richtige Anzahl von Vorlagenmustern in die Vorlage aufzunehmen.
Gruppentrennzeichen und Dezimalpunkt
Wenn Sie mit größeren Zahlen und/oder Zahlen mit Sekundenbruchteilen arbeiten, müssen Sie Vorlagenmuster einfügen, die das Gruppentrennzeichen und/oder das Dezimalkomma angeben.
Dafür gibt es zwei Möglichkeiten.
Die erste Möglichkeit besteht darin, das Komma und den Dezimalpunkt buchstäblich auszutippen.
SELECT to_number('7,000.25', '9,999.99');
Ergebnis:
7000.25
Die zweite Option besteht darin, die gebietsschemaabhängigen Versionen zu verwenden. Dies sind G für das Gruppentrennzeichen (Tausendertrennzeichen) und D für das Dezimalkomma.
Das vorherige Beispiel könnte also wie folgt umgeschrieben werden:
SELECT to_number('7,000.25', '9G999D99');
Ergebnis:
7000.25
Währungssymbol
Das L
Template-Muster repräsentiert ein gebietsschemaabhängiges Währungssymbol.
SELECT to_number('$7,000.25', 'L9G999D99');
Ergebnis:
7000.25
Rückgabetyp
Der Rückgabewert von to_number()
Funktion ist numerisch.
Sie können den Rückgabetyp mit pg_typeof()
überprüfen Funktion.
SELECT pg_typeof(to_number('$7,000.25', 'L9G999D99'));
Ergebnis:
numeric
Unerwartete Ergebnisse?
Es ist wichtig, die Vorlage richtig zu machen. Andernfalls könnten Sie mit unerwarteten Ergebnissen enden.
Hier ist ein Beispiel dafür, was passiert, wenn ich einfach vergesse, das L
einzufügen Vorlagenmuster aus dem vorherigen Beispiel.
SELECT to_number('$7,000.25', '9G999D99');
Ergebnis:
7000
Also, weil ich vergessen habe, das L
einzufügen Vorlagenmuster (für die Währung), dadurch wurde die gesamte Vorlage nicht mehr synchron mit der Zahl, was zu G
führte ignoriert werden, sowie das D
.
Nur um es klarzustellen, hier ist es noch einmal im Vergleich zur richtigen Vorlage.
SELECT
to_number('$7,000.25', 'L9G999D99') AS "Right",
to_number('$7,000.25', '9G999D99') AS "Wrong";
Ergebnis:
Right | Wrong ---------+------- 7000.25 | 7000
to_number() vs. cast()
Der to_number()
Die Funktion wird hauptsächlich bereitgestellt, um Eingabeformate zu verarbeiten, die nicht durch einfaches Casting konvertiert werden können. Es ist daher für standardmäßige numerische Darstellungen im Allgemeinen nicht erforderlich.
Das erste Beispiel auf dieser Seite hätte also mit cast()
gemacht werden können .
SELECT cast('80' AS NUMERIC);
Ergebnis:
80
Aber wir fangen an, in Schwierigkeiten zu geraten, sobald die Dinge etwas komplexer werden.
SELECT cast('$7,000.25' AS NUMERIC);
Ergebnis:
ERROR: invalid input syntax for type numeric: "$7,000.25" LINE 1: SELECT cast('$7,000.25' AS NUMERIC);
Also to_number()
wurde hauptsächlich für Situationen wie diese entwickelt.
Vollständige Liste der Vorlagenmuster und Modifikatoren
Postgres enthält viel mehr Vorlagenmuster und Modifikatoren.
Diese können auch bei der Formatierung numerischer Werte verwendet werden (z. B. bei der Verwendung von to_char()
Funktion, um eine formatierte Zeichenfolgendarstellung der Zahl zurückzugeben).
Eine vollständige Liste finden Sie unter Template Patterns &Modifiers for Numeric Formatting in PostgreSQL.