2015-04-01 2 views
7

В PostgreSQL я хотел бы сохранить подписанные значения -999.9 - 9999.9. Могу ли я использовать numeric(5.1)?Может ли тип данных Postgres NUMERIC хранить подписанные значения?

Или какой тип использовать?

+0

Точность в POSTGRESQL числового это общее число значащих цифр, а масштаб этого число знаков после запятой требуется. 9999.9 имеет 5 цифр и 1 десятичное место, так что да, 'numeric (5.1)' будет ОК. Подробнее см. [Документацию] (http://www.postgresql.org/docs/9.3/static/datatype-numeric.html#DATATYPE-NUMERIC-DECIMAL). –

+0

является числовым (5.1) OK для -999.9? –

+2

Почему бы вам не попробовать вставить отрицательное значение и посмотреть, что произойдет? Во всяком случае, 'numeric' является частью стандарта sql, и да, он подписан. –

ответ

7

Вы можете использовать arbitrary precision type numeric с точностью до 5 и шкалой от 1, just like @Simon commented, но без синтаксической ошибки. Используйте запятую (,) вместо точки (.) в модификаторе типа:

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 

знак минус и точка в строковый литерал, не засчитываются допустимого максимума значащих цифр (precision).
Если вам не нужно ограничивать длину, просто используйте numeric.
Если вам необходимо обеспечить соблюдение минимального и максимального, добавьте check constraint:

CHECK (nr_column BETWEEN -999.9 AND 9999.9) 

numeric хранит ваш номер точно. Если вам не нужна абсолютная точность и крошечные ошибки округления, не проблема, вы также можете использовать один из типов с плавающей точкой double precision (float8) или real (float4).

Или, поскольку вы допускаете только одну дробную десятичную цифру, вы можете умножить на 10 и использовать integer, что будет наиболее эффективным хранилищем: 4 байта, отсутствие ошибок округления и самая быстрая обработка. Просто используйте и запишите номер правильно.

Details for numeric types in the manual.

+0

Спасибо @Erwin, отличный ответ! –

Смежные вопросы