In PostgreSQL, puoi usare to_number()
funzione per convertire una stringa in un valore numerico.
Più specificamente, converte la rappresentazione di stringa di un numero in un valore numerico.
Ad esempio, se hai $1,234.50
come stringa, puoi usare to_number()
per convertirlo in un numero effettivo che utilizza il numero tipo di dati.
Sintassi
La sintassi è questa:
to_number(text, text)
Dove il primo argomento è una rappresentazione in formato stringa del numero e il secondo argomento definisce il modello utilizzato dal primo argomento.
Esempio
Ecco un esempio di base da dimostrare.
SELECT to_number('80', '99');
Risultato:
80
In questo caso, ho usato 99
come modello. Ogni 9
è indicato come un "modello modello". Il 9
il modello di modello rappresenta una posizione di una cifra. Ne ho usati due, perché volevo che fossero incluse entrambe le cifre.
Ecco cosa succede se rimuovo uno dei 9
s.
SELECT to_number('80', '9');
Risultato:
8
Quindi è importante includere il numero corretto di modelli di modello nel modello.
Separatore di gruppo e punto decimale
Quando lavori con numeri più grandi e/o numeri con secondi frazionari, dovrai includere modelli di modelli che specifichino il separatore di gruppo e/o il punto decimale.
Ci sono due modi per farlo.
La prima opzione è digitare letteralmente la virgola e il punto decimale.
SELECT to_number('7,000.25', '9,999.99');
Risultato:
7000.25
La seconda opzione consiste nell'usare le versioni compatibili con le impostazioni locali. Questi sono G per il separatore di gruppo (separatore delle migliaia) e D per il punto decimale.
Quindi l'esempio precedente potrebbe essere riscritto come segue:
SELECT to_number('7,000.25', '9G999D99');
Risultato:
7000.25
Simbolo di valuta
La L
il modello di modello rappresenta un simbolo di valuta compatibile con le impostazioni locali.
SELECT to_number('$7,000.25', 'L9G999D99');
Risultato:
7000.25
Tipo di reso
Il valore di ritorno di to_number()
la funzione è numerica.
Puoi controllare il tipo restituito con pg_typeof()
funzione.
SELECT pg_typeof(to_number('$7,000.25', 'L9G999D99'));
Risultato:
numeric
Risultati imprevisti?
È importante ottenere il modello giusto. Altrimenti potresti avere risultati inaspettati.
Ecco un esempio di cosa succede se mi dimentico semplicemente di includere la L
modello modello dall'esempio precedente.
SELECT to_number('$7,000.25', '9G999D99');
Risultato:
7000
Quindi perché ho dimenticato di includere la L
modello di modello (per la valuta), questo ha messo l'intero modello non sincronizzato con il numero, che ha portato alla G
essere ignorato, così come il D
.
Giusto per essere chiari, eccolo di nuovo rispetto al modello corretto.
SELECT
to_number('$7,000.25', 'L9G999D99') AS "Right",
to_number('$7,000.25', '9G999D99') AS "Wrong";
Risultato:
Right | Wrong ---------+------- 7000.25 | 7000
to_number() vs cast()
Il to_number()
la funzione viene fornita principalmente per gestire formati di input che non possono essere convertiti mediante semplice casting. Non è quindi generalmente necessario per le rappresentazioni numeriche standard.
Quindi il primo esempio in questa pagina potrebbe essere stato fatto usando cast()
.
SELECT cast('80' AS NUMERIC);
Risultato:
80
Ma iniziamo ad avere problemi quando le cose diventano un po' più complesse.
SELECT cast('$7,000.25' AS NUMERIC);
Risultato:
ERROR: invalid input syntax for type numeric: "$7,000.25" LINE 1: SELECT cast('$7,000.25' AS NUMERIC);
Quindi to_number()
è stato progettato principalmente per situazioni come questa.
Elenco completo di modelli e modificatori di modelli
Postgres include molti più modelli e modificatori di modelli.
Questi possono essere utilizzati anche durante la formattazione di valori numerici (ad esempio quando si utilizza to_char()
funzione per restituire una rappresentazione di stringa formattata del numero).
Vedi Modelli e modificatori di modelli per la formattazione numerica in PostgreSQL per un elenco completo.