Convertire numeri formattati in SQL

E' una semplice nota, messa come reminder per un problema ricorrente: ho una tabella con dei numeri che però sono formattati (con punti separatori delle migliaia e virgole), ed hanno il segno espresso come carattere (D/A).

Si tratta di una situazione ricorrente quando si elaborano dati ricavati da spool di stampa.

Riporto alcune funzioni, applicabili al DB2 dll'iSeries IBM, ma sicuramente adattabili ad altri dialetti, per ottenere il risultato voluto.

 

Esempio

Supponiamo che la mia tabella contenga un campo IMPORTO, con il numero formattato, ad esempio:

" 145.287,22"

Le virgolette evidenziano i limiti del campo, il cui contenuto è preceduto da spazi.

Inoltre ho un campo SEGNO, che assume i valori 'D', oppure 'A', oppure è blank se l'importo è zero.

A questo punto, posso convertire il tutto in un numero decimale con questo insieme di funzioni scalari:

DECIMAL(REPLACE(REPLACE(REPLACE(SEGNO, ' ', '1'), 'D', '1'),'A', '-1'))*DECIMAL(REPLACE(IMPORTO, '.', ''), 13, 2, ',') as IMPORTO

Il risultato è una colonna IMPORTO, numerica (in questo caso con 13 digits e due decimali - il formato DECIMAL è tipico dell'iSeries, ma posso benissimo ottenere un FLOAT, o altri tipi numerici) con segno positivo se l'importo è in dare, negativo se è in avere.

Massimo Coletti
09-Set-2005