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.