2015-04-01 16 views
7

In PostgreSQL, vorrei memorizzare i valori firmati -999.9 - 9999.9. Posso usare numeric(5.1) per questo?Il tipo di dati Postgres può contenere valori firmati NUMERIC?

O che tipo dovrei usare?

+0

La precisione di un numerico PostgreSQL è il numero totale di cifre significative, e la scala è il numero di decimali richiesti. 9999.9 ha 5 cifre e 1 decimale, quindi sì, 'numerico (5.1)' sarà OK. Vedere [la documentazione] (http://www.postgresql.org/docs/9.3/static/datatype-numeric.html#DATATYPE-NUMERIC-DECIMAL) per i dettagli. –

+0

è numerico (5.1) OK per -999.9? –

+2

Perché non provi ad inserire un valore negativo e vedi cosa succede? Ad ogni modo, 'numeric' è parte dello standard sql e sì, è firmato. –

risposta

7

È possibile utilizzare lo arbitrary precision type numeric con una precisione di 5 e una scala di 1, just like @Simon commented, ma senza l'errore di sintassi. Utilizzare una virgola (,) al posto del punto (.) nel tipo di modifica:

SELECT numeric(5,1) '-999.9' AS nr_lower 
    , numeric(5,1) '9999.9' AS nr_upper; 

nr_lower | nr_upper 
----------+---------- 
    -999.9 | 9999.9 

Il segno meno e il punto nella stringa letterale non contano contro il massimo consentito di cifre significative (precision).
Se non è necessario limitare la lunghezza, utilizzare solo numeric.
Se è necessario far rispettare minimo e massimo, aggiungere un check constraint:

CHECK (nr_column BETWEEN -999.9 AND 9999.9) 

numeric memorizza il tuo numero di esattamente. Se non è necessaria la precisione assoluta e gli errori di arrotondamento minimi non sono un problema, è possibile utilizzare uno dei tipi a virgola mobile double precision (float8) o real (float4).

Oppure, poiché si consente solo una singola cifra decimale frazionaria, è possibile moltiplicare per 10 e utilizzare integer, che sarebbe la memoria più efficiente: 4 byte, nessun errore di arrotondamento e elaborazione più veloce. Basta usare e documentare correttamente il numero.

Details for numeric types in the manual.

+0

Grazie a @Erwin, ottima risposta! –

Problemi correlati