

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 数値型
<a name="Numeric_types"></a>

数値データ型には、整数型、10 進数型、および浮動小数点数型などがあります。

**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/ja_jp/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 キーワードは同じように使用できます。このドキュメントでは、このデータ型を表す用語として *decimal* を優先的に使用します。*numeric* という用語は一般的に整数、10 進数、および浮動小数点のデータ型を称する場合に使用します。

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

テーブル内に DECIMAL 列を定義するには、*precision* と *scale* を次のように指定します。

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

 *precision*   
値全体での有効な桁の合計。小数点の両側の桁数。例えば、数値 `48.2891` の場合は精度が 6、スケールが 4 となります。指定がない場合、デフォルトの精度は 18 です。最大精度は 38 です。  
 入力値で小数点の左側の桁数が、列の精度から列のスケールを引いて得られた桁数を超えている場合、入力値を列にコピー (または挿入も更新も) することはできません。このルールは、列の定義を外れるすべての値に適用されます。例えば、`numeric(5,2)` 列の値の許容範囲は、`-999.99`～`999.99` です。

 *scale*   
小数点の右側に位置する、値の小数部における小数の桁数です。整数のスケールはゼロです。列の仕様では、スケール値は精度値以下である必要があります。指定がなければ、デフォルトのスケールは 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 ビット値の 2 倍のディスク容量を使用するので、クエリの実行時間が長くなる可能性があります。

# 浮動小数点型
<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 の 2 進浮動小数点演算に従って倍精度浮動小数点形式を表します。精度は約 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、次の表は、加算、減算、乗算、除算オペレーションで予想される戻り型を示しています。表の左側の最初の列は計算の 1 番目のオペランドを示し、一番上の行は 2 番目のオペランドを示します。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/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`と は 2 番目のオペランドの精度とスケール`s2`を表します。(これらの計算に関係なく、結果の最大精度は 38、結果の最大スケールは 38 です)。

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

例えば、SALES テーブルの PRICEPAID 列と COMMISSION 列は両方とも DECIMAL(8,2) 列です。PRICEPAID を COMMISSION で除算する場合 (または COMMISSION を PRICEPAID で除算する場合)、計算式は次のように適用されます。

```
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)
```

次の計算は、UNION、INTERSECT、EXCEPT などの集合演算子および COALESCE や DECODE などの関数を使用して DECIMAL 値に対して演算を実行した場合に、結果として生じる精度とスケールを計算するための汎用的なルールです。

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

例えば、DECIMAL(7,2) 列が 1 つ含まれる DEC1 テーブルと、DECIMAL(15,3) 列が 1 つ含まれる 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>

除算演算の場合、ゼロ除算を行うとエラーが返されます。

精度とスケールが計算されると、スケール制限 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 テーブルの PRICEPAID 列 (DECIMAL(8,2) 列) からの値をすべてキャストできるとは限らないので、結果として DECIMAL(7,3) を返すことはできません。

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

  このエラーは、PRICEPAID 列に含まれる大きな値の**いくつかをキャストできないために発生します。
+ 乗算演算によって得られる結果では、結果スケールが各オペランドのスケールを足し算した値となります。例えば、両方のオペランドとも 4 桁のスケールを持っている場合、結果としてスケールは 8 桁となり、小数点の左側には 10 桁のみが残ります。したがって、有効スケールを持つ 2 つの大きな数値を乗算する場合は、比較的簡単にオーバーフロー状態に陥ります。

## 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)
```