typecast string to integer - Postgres


122

Ich importiere Daten aus einer Tabelle mit Roh-Feeds in Varchar. Ich muss eine Spalte in varchar in eine Zeichenfolgenspalte importieren. Ich habe versucht, das <column_name>::integersowie zu verwenden, to_number(<column_name>,'9999999')aber ich erhalte Fehler, da es einige leere Felder gibt, muss ich sie als leer oder null in die neue Tabelle abrufen.

Bitte lassen Sie mich wissen, ob es eine Funktion dafür gibt.


5
Können Sie uns die Fehlermeldung anzeigen? Das würde helfen
Frank Heikens

Antworten:


124

Wilde Vermutung: Wenn Ihr Wert eine leere Zeichenfolge ist, können Sie NULLIF verwenden, um ihn durch eine NULL zu ersetzen:

SELECT
    NULLIF(your_value, '')::int

55

Sie können sogar noch einen Schritt weiter gehen und dieses zusammengeführte Feld einschränken, wie zum Beispiel:

SELECT CAST(coalesce(<column>, '0') AS integer) as new_field
from <table>
where CAST(coalesce(<column>, '0') AS integer) >= 10; 

27

Wenn Sie leere Spalten als NULLs behandeln müssen, versuchen Sie Folgendes:

SELECT CAST(nullif(<column>, '') AS integer);

Wenn Sie jedoch NULLWerte haben , die Sie vermeiden müssen, versuchen Sie Folgendes:

SELECT CAST(coalesce(<column>, '0') AS integer);

Ich stimme zu, Fehlermeldung würde viel helfen.


24

Der einzige Weg, wie ich keinen Fehler aufgrund von NULL, Sonderzeichen oder leeren Zeichenfolgen habe, ist folgender:

SELECT REGEXP_REPLACE(COALESCE(<column>::character varying, '0'), '[^0-9]*' ,'0')::integer FROM table

2
Für mich (9.6.2) war dies das einzige, was funktionierte, alle anderen Antworten schlugen fehl.
Jasper de Vries

2
Könnten Sie nicht eine hinzufügen WHERE <column> != NULL?
Matthieu

13

Ich kann Lukas 'Beitrag nicht kommentieren (zu wenig Ruf? Ich bin ziemlich neu).

Auf meinem PG to_number(NULL)funktioniert das Setup nicht, daher wäre meine Lösung:

SELECT CASE WHEN column = NULL THEN NULL ELSE column :: Integer END
FROM table

1
Dies sollte funktionieren, sollte aber genau dem weniger ausführlichen NULLIF()Ansatz entsprechen. Der Standard definiert NULLIF tatsächlich als eine Form des CASE-Prädikats.
kgrittn

12

Wenn der Wert nicht numerische Zeichen enthält, können Sie den Wert wie folgt in eine Ganzzahl konvertieren:

SELECT CASE WHEN <column>~E'^\\d+$' THEN CAST (<column> AS INTEGER) ELSE 0 END FROM table;

Der CASE-Operator überprüft die <Spalte>. Wenn sie mit dem Ganzzahlmuster übereinstimmt, konvertiert er die Rate in eine Ganzzahl, andernfalls gibt er 0 zurück


0

Sie können diese Abfrage verwenden

SUM(NULLIF(conversion_units, '')::numeric)

0

Gemeinsames Problem

Geben Sie naiv einen beliebigen String in eine solche Ganzzahl ein

SELECT ''::integer

Oft ergibt sich der berühmte Fehler:

Query failed: ERROR: invalid input syntax for integer: ""

Problem

PostgreSQL hat keine vordefinierte Funktion zum sicheren Eingeben eines Strings in eine Ganzzahl.

Lösung

Erstellen Sie eine benutzerdefinierte Funktion, die von der intval () - Funktion von PHP inspiriert ist .

CREATE FUNCTION intval(character varying) RETURNS integer AS $$

SELECT
CASE
    WHEN length(btrim(regexp_replace($1, '[^0-9]', '','g')))>0 THEN btrim(regexp_replace($1, '[^0-9]', '','g'))::integer
    ELSE 0
END AS intval;

$$
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;

Verwendung

/* Example 1 */
SELECT intval('9000');
-- output: 9000

/* Example 2 */
SELECT intval('9gag');
-- output: 9

/* Example 3 */
SELECT intval('the quick brown fox jumps over the lazy dog');
-- output: 0
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.