NUMERIC

数字数据类型存储定点数字数据。例如,价值 $123.45 可存储于 NUMERIC(5,2) 字段。请注意,第一个数字(精度)指定位数。

语法

numeric‑type [ ( precision[, scale] ) ]

参数

默认精度和标度

NUMERICDECIMALNUMBERMONEY 的默认精度和标度值不同:

支持的编码

Vertica 支持 数字数据类型的以下编码:

  • 精度 ≤ 18:AUTOBLOCK_DICTBLOCKDICT_COMPCOMMONDELTA_COMPDELTAVALGCDDELTARLE

  • 精密 >18:AUTOBLOCK_DICTBLOCKDICT_COMPRLE

有关详细信息,请参阅编码类型

数字与整数和浮点数据类型

数字数据类型是存储具有特定精度和标度的值的精确数据类型,通过小数点前后的若干数字表示。这与 Vertica 整数和浮点数据类型形成对比:

  • DOUBLE PRECISION (FLOAT) 支持 ~15 数字、变指数,近似表示数字值。它可能不如 NUMERIC 数据类型精确。

  • INTEGER 支持 ~18 数字,仅限整数。

NUMERIC 数据类型是非整数常量的首选,因为其结果总是精确的。例如:

=> SELECT 1.1 + 2.2 = 3.3;
?column?
----------
 t
(1 row)

=>  SELECT 1.1::float + 2.2::float = 3.3::float;
 ?column?
----------
 f
(1 row)

数字操作

支持的数字操作如下:

  • NUMERIC 除数运算直接运行于数字值,不会转换为浮点数。运算结果具有至少 18 位,且四舍五入。

  • NUMERIC 模数运算(包括%)直接运行于数字值,不会转换为浮点数。结果与分子具有相同标度,无需四舍五入。

  • 一些使用数字数据类型复杂操作会导致隐式转换为 FLOAT。使用 SQRT、STDDEV、超越函数,例如 LOG 以及 TO_CHAR/TO_NUMBER 格式化时,结果总是 FLOAT。

示例

下面的一系列命令创建一个包含数字数据类型的表,并对数据执行一些数学运算。

=> CREATE TABLE num1 (id INTEGER, amount NUMERIC(8,2));

向表中插入一些值:

=> INSERT INTO num1 VALUES (1, 123456.78);

查询表:

=> SELECT * FROM num1;
  id  |  amount
------+-----------
    1 | 123456.78
(1 row)

下面的例子从表 num1 返回 NUMERIC 列、总数:

=> SELECT amount FROM num1;
  amount
-----------
 123456.78
(1 row)

下面的语法在总数上加一 (1):

=> SELECT amount+1 AS 'amount' FROM num1;
  amount
-----------
 123457.78
(1 row)

下面的语法将总数列乘以 2:

=> SELECT amount*2 AS 'amount' FROM num1;
  amount
-----------
 246913.56
(1 row)

下面的语法为总数列返回负数:

=> SELECT -amount FROM num1;
?column?
------------
-123456.78
(1 row)

下面的语法返回总数实参的绝对值:

=> SELECT ABS(amount) FROM num1;
ABS
-----------
123456.78
(1 row)

下面的语法将 NUMERIC 总数转换为 FLOAT 数据类型:

=> SELECT amount::float FROM num1;
  amount
-----------
 123456.78
(1 row)

另请参阅

算数函数