PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come funziona la funzione to_number() in PostgreSQL

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.