stringa typecast in numero intero - Postgres


123

Sto importando dati da una tabella che ha feed non elaborati in Varchar, devo importare una colonna in varchar in una colonna di stringa. Ho provato a utilizzare <column_name>::integercosì come to_number(<column_name>,'9999999')ma ricevo errori, poiché ci sono alcuni campi vuoti, ho bisogno di recuperarli come vuoti o nulli nella nuova tabella.

Fammi sapere se esiste una funzione per lo stesso.


5
Potresti mostrarci il messaggio di errore? Ciò aiuterebbe
Frank Heikens

Risposte:


126

Indovina selvaggia: se il tuo valore è una stringa vuota, puoi utilizzare NULLIF per sostituirlo con un NULL:

SELECT
    NULLIF(your_value, '')::int

56

Puoi anche andare oltre e limitare questo campo unito come, ad esempio: -

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

28

Se devi trattare le colonne vuote come NULLs, prova questo:

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

D'altra parte, se hai NULLvalori che devi evitare, prova:

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

Sono d'accordo, il messaggio di errore aiuterebbe molto.


25

L'unico modo in cui riesco a non avere un errore a causa di NULL, caratteri speciali o stringa vuota è in questo modo:

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

2
Per me (9.6.2) questa è stata l'unica cosa che ha funzionato, tutte le altre risposte sono fallite.
Jasper de Vries

2
Non potresti aggiungere un WHERE <column> != NULL?
Matthieu

14

Non riesco a commentare (troppa poca reputazione? Sono abbastanza nuovo) sul post di Lukas.

Sul mio PG la configurazione to_number(NULL)non funziona, quindi la mia soluzione sarebbe:

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

1
Questo dovrebbe funzionare, ma dovrebbe essere un equivalente esatto dell'approccio meno prolisso NULLIF(). Lo standard definisce effettivamente NULLIF come una forma del predicato CASE.
kgrittn

13

Se il valore contiene caratteri non numerici, è possibile convertire il valore in un numero intero come segue:

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

L'operatore CASE controlla la <colonna>, se corrisponde al pattern intero, converte il tasso in un intero, altrimenti restituisce 0



1

Problema comune

Digita ingenuamente il casting di qualsiasi stringa in un intero in questo modo

SELECT ''::integer

Spesso risulta il famoso errore:

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

Problema

PostgreSQL non ha una funzione predefinita per la sicurezza cast qualsiasi stringa in un intero.

Soluzione

Crea una funzione definita dall'utente ispirata alla funzione intval () di PHP .

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;

uso

/* 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.