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.

Vijay DJ
quelle
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
Frank Heikens
quelle
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; 
schmuddelig
quelle
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.

vyegorov
quelle
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
Charles Hamel
quelle
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
niko
quelle
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

Igor Ostrovsky
quelle
0

Sie können diese Abfrage verwenden

SUM(NULLIF(conversion_units, '')::numeric)
Abdul Quadir
quelle
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
Abel Callejo
quelle