

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 數值類型
<a name="Numeric_types"></a>

數值資料類型包括整數、小數和符點數。

**Topics**
+ [整數類型](Numeric_types-integer-types.md)
+ [DECIMAL 或 NUMERIC 類型](Numeric_types-decimal-or-numeric-type.md)
+ [浮點類型](Numeric_types-floating-point-types.md)
+ [數值的計算](Numeric_computations.md)

# 整數類型
<a name="Numeric_types-integer-types"></a>

使用下列資料類型來存放各種範圍的整數。您無法將值存放在每種類型的允許範圍之外。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/clean-rooms/latest/sql-reference/Numeric_types-integer-types.html)

# DECIMAL 或 NUMERIC 類型
<a name="Numeric_types-decimal-or-numeric-type"></a>

使用 DECIMAL 或 NUMERIC 資料類型，以*使用者定義的精確度*來儲存數值。DECIMAL 和 NUMERIC 關鍵字可互換使用。在本文件中，*小數*是此資料類型的首選用詞。*數值*一詞通常是用來指稱整數、小數和浮點資料類型。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/clean-rooms/latest/sql-reference/Numeric_types-decimal-or-numeric-type.html)

藉由指定 *precision* 和 *scale*，來定義資料表中的 DECIMAL 欄：

```
decimal(precision, scale)
```

 *precision*   
整個值中有效位數的總數：小數點兩邊的位數數量。例如，數字 `48.2891` 的精確度 (有效位數) 為 6，小數位數為 4。如果未指定，預設的精確度為 18，最高精確度為 38。  
 如果輸入值中小數點左側的位數超過資料欄的精確度減去其比例，則無法將該值複製到資料欄 （或插入或更新）。此規則適用於超出資料欄定義範圍之外的任何值。例如，`numeric(5,2)` 欄的值，其允許的範圍為 `-999.99` 到 `999.99`。

 *scale*   
數值小數部分中，位於小數點右邊的小數位數數目。整數的小數位數為 0。在資料欄的規格中，小數位數的值必須小於或等於精確度的值。如果未指定，預設的小數位數為 0，最大的小數位數為 37。  
如果載入資料表的輸入值，其小數位數大於資料欄的小數位數，則此值會四捨五入至指定的小數位數。例如，SALES 資料表中的 PRICEPAID 資料欄為 DECIMAL(8,2) 資料欄。如果將 DECIMAL(8,4) 值插入 PRICEPAID 資料欄，會將此值四捨五入為 2 個小數位數。  

```
insert into sales
values (0, 8, 1, 1, 2000, 14, 5, 4323.8951, 11.00, null);

select pricepaid, salesid from sales where salesid=0;

pricepaid | salesid
-----------+---------
4323.90 |       0
(1 row)
```
 不過，從資料表所選取值的明確轉換結果，不會四捨五入。

**注意**  
可以插入 DECIMAL(19,0) 資料欄的正數值上限為 `9223372036854775807` (263 -1)。負數值上限為 `-9223372036854775807`。例如，如果試圖插入數值 `9999999999999999999` (19 個 9)，將會造成溢位錯誤。無論小數點的位置何在， AWS Clean Rooms 可以表示為 DECIMAL 數值的最大字串是 `9223372036854775807`。例如，可以載入 DECIMAL(19,18) 資料欄的最大值為 `9.223372036854775807`。  
這些規則的原因如下：  
具有 19 個或更少有效位數精度的 DECIMAL 值會在內部儲存為 8 位元組整數。
精確度為 20 到 38 個有效位數的 DECIMAL 值會儲存為 16 位元組整數。

## 關於使用 128 位元 DECIMAL 或 NUMERIC 資料欄的備註
<a name="Numeric_types-notes-about-using-128-bit-decimal-or-numeric-columns"></a>

除非您確定應用程式需要該精確度，否則請勿任意指派最大有效位數給 DECIMAL 欄。128 位元值使用的磁碟空間是 64 位元值的兩倍，而且可能會減慢查詢執行時間。

# 浮點類型
<a name="Numeric_types-floating-point-types"></a>

使用 REAL 和 DOUBLE PRECISION 資料類型，以*可變精確度*來儲存數值。這些是*不精確*的類型，代表某些數值會以近似值儲存，因此在儲存和傳回特定值時，可能會造成些微的出入。如果您需要精確的儲存和計算 (例如貨幣金額)，請使用 DECIMAL 資料類型。

REAL 代表根據浮點數運算的 IEEE 標準 754 的單精度浮點格式。它具有大約 6 位數的精確度，並且範圍約為 1E-37 到 1E\$137。您也可以將此資料類型指定為 FLOAT4。

DOUBLE PRECISION 代表遵循二進位浮點數運算之 IEEE 標準 754 的雙精確度浮點格式。它具有大約 15 位數的精確度，並且範圍約為 1E-307 到 1E\$1308。您也可以將此資料類型指定為 FLOAT 或 FLOAT8。

# 數值的計算
<a name="Numeric_computations"></a>

在 中 AWS Clean Rooms，*運算*是指二進位數學運算：加法、減法、乘法和除法。本節說明這些運算預期的傳回類型，以及使用 DECIMAL 資料類型時，用來決定精確度與小數位數的特定公式。

在查詢處理作業期間計算數值時，可能會遇到無法進行計算的情況，而且查詢會傳回數值溢位錯誤。您也可能會遇到計算值的小數位數改變或出乎意料的情況。針對某些運算，您可以使用明確轉換 (類型提升) 或 AWS Clean Rooms 設定參數，來解決這些問題。

關於使用 SQL 函式進行類似計算的結果，詳細資訊請參閱 [AWS Clean Rooms Spark SQL 函數](sql-functions-topic-spark.md)。

## 計算的傳回類型
<a name="Numeric_computations-return-types"></a>

鑑於 中支援的一組數值資料類型 AWS Clean Rooms，下表顯示新增、減去、乘法和分割操作的預期傳回類型。表格左側的第一欄代表計算中的第一個運算元，最上面的列代表第二個運算元。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/clean-rooms/latest/sql-reference/Numeric_computations.html)

## 計算出 DECIMAL 結果的精確度和小數位數
<a name="Numeric_computations-precision-and-scale-of-computed-decimal-results"></a>

下表顯示摘要，說明在數學運算傳回 DECIMAL 結果時，用來計算結果精確度和小數位數的規則。在此表格中， `p1` 和 `s1`代表計算中第一個運算元的精確度和比例。 `p2`和 `s2`代表第二個運算元的精確度和比例。(無論這些計算如何，結果的最高精確度為 38、結果的最大小數位數為 38。) 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/clean-rooms/latest/sql-reference/Numeric_computations.html)

例如，SALES 資料表中的 PRICEPAID 和 COMMISSION 資料欄都是 DECIMAL(8,2) 資料欄。如果將 PRICEPAID 除以 COMMISSION (或反過來)，會如下套用公式：

```
Precision = 8-2 + 2 + max(4,2+8-2+1)
= 6 + 2 + 9 = 17

Scale = max(4,2+8-2+1) = 9

Result = DECIMAL(17,9)
```

下列的計算是一般規則，適用於針對 DECIMAL 數值的運算 (使用 UNION、INTERSECT 和 EXCEPT 等集合運算子，或 COALESCE 和 DECODE 等函式)，計算出結果的精確度和小數位數：

```
Scale = max(s1,s2)
Precision = min(max(p1-s1,p2-s2)+scale,19)
```

例如，包含一個 DECIMAL(7,2) 資料欄的 DEC1 資料表，會與包含一個 DECIMAL(15,3) 資料欄的 DEC2 資料表聯結，以產生 DEC3 資料表。DEC3 的結構描述顯示，其資料欄會變成 NUMERIC(15,3) 資料欄。

```
select * from dec1 union select * from dec2;
```

在上述的範例中，會如下套用公式：

```
Precision = min(max(7-2,15-3) + max(2,3), 19)
= 12 + 3 = 15

Scale = max(2,3) = 3

Result = DECIMAL(15,3)
```

## 關於除法運算的備註
<a name="Numeric_computations-notes-on-division-operations"></a>

如果是除法運算，除以 0 的情況會傳回錯誤。

在計算出精確度和小數位數之後，會套用 100 個小數位數的限制。如果計算結果的小數位數大於 100，除的結果會如下設定小數位數：
+ 精確度 = ` precision - (scale - max_scale)` 
+ 擴展 = ` max_scale ` 

如果計算出的精確度大於最高精確度 (38)，則精確度會降低為 38，而小數位數會變成下列算式的結果：`max(38 + scale - precision), min(4, 100))`

## 溢位狀況
<a name="Numeric_computations-overflow-conditions"></a>

會針對所有數值運算檢查溢位。具有 19 個 (含) 以下有效位數 (精確度) 的 DECIMAL 資料，會儲存為 64 位元整數。具有 19 個 (含) 以上有效位數 (精確度) 的 DECIMAL 資料，會儲存為 128 位元整數。所有 DECIMAL 數值的最高精確度為 38、最大小數位數為 37。當數值超出這些限值時，會出現溢位錯誤，這會同時發生於中間的和最終的結果集：
+ 當特定資料值不符合轉換函數指定的請求精確度或規模時，明確轉換會導致執行時間溢位錯誤。例如，您無法從 SALES 資料表 (DECIMAL(8，2) 欄） 中的 PRICEPAID 欄轉換所有值，並傳回 DECIMAL(7，3) 結果：

  ```
  select pricepaid::decimal(7,3) from sales;
  ERROR:  Numeric data overflow (result precision)
  ```

  發生此錯誤是因為 PRICEPAID 欄中*某些*較大的值無法轉換。
+ 在乘法運算所產生的結果中，其小數位數是每個運算元小數位數的總和。例如，如果兩個運算元都有 4 個小數位數，結果的小數位數是 8 個，使得小數點的左邊只有 10 個位數。因此，在將兩個都擁有大量小數位數的大數值相乘時，就會相當容易產生溢位狀況。

## INTEGER 和 DECIMAL 類型的數值計算
<a name="Numeric_computations-numeric-calculations-with-integer-and-decimal-types"></a>

當計算中的其中一個運算元具有 INTEGER 資料類型，而另一個運算元是 DECIMAL 時，INTEGER 運算元會隱含轉換為 DECIMAL。
+ SMALLINT 或 SHORT 會轉換為 DECIMAL(5，0) 
+ INTEGER 轉換為 DECIMAL(10，0) 
+ BIGINT 或 LONG 轉換為 DECIMAL(19，0) 

例如，如果將 DECIMAL(8,2) 資料欄 SALES.COMMISSION 乘以 SMALLINT 資料欄 SALES.QTYSOLD，此計算式會進行如下的轉換：

```
DECIMAL(8,2) * DECIMAL(5,0)
```