数値データ型

このトピックでは、Snowflakeでサポートされている数値データ型と、数値定数およびリテラルでサポートされている形式について説明します。

固定小数点数のデータ型

Snowflakeは、固定小数点数について次のデータ型をサポートしています。

NUMBER

オプションの精度とスケールを使用した、最大38桁の数字です。

精度:

許可される合計桁数です。

スケール:

小数点の右側に許可される桁数です。

デフォルトでは、精度は38、スケールは0です(つまり、 NUMBER(38, 0))。精度は、与えられた型の列に挿入(またはキャスト)できる値の範囲を制限します。たとえば、 999 という値は NUMBER(38,0)には入りますが、 NUMBER(2,0)には入りません。

精度は許可される合計桁数であるため、小数点の左側の桁数が、列の精度からそのスケールを引いた数を超える場合、値を NUMBER 列にロードすることはできません。たとえば、 NUMBER(20, 2)の場合、小数点の左側に18桁、小数点の右側に2桁の合計20桁を使用できます。

最大スケール (小数点の右側の桁数)は37です。有効数字が38桁未満であっても、有効数字の最小桁が10進数の37桁を超えるような数字、たとえば0.0000000000000000000000000000000000000012(1.2e-39)は、何桁かの精度を失うことなく表現することができません。

注釈

データが精度の低い別のデータ型に変換され、再び精度の高いデータ型に変換されると、データの精度が失われる可能性があります。たとえば、 NUMBER(38,37)の値を DOUBLE 値(およそ小数点15桁の精度)に変換してから NUMBER に戻すと、精度が失われます。

Snowflakeは FLOAT データ型もサポートしているため、精度は低くなりますが、より広い範囲の値を使用できます。

DECIMAL , DEC , NUMERIC

NUMBERと同義語です。

INT , INTEGER , BIGINT , SMALLINT , TINYINT , BYTEINT

NUMBER と同義ですが、精度とスケールは指定できません(つまり、デフォルトは常に NUMBER(38, 0))。したがって、すべての INTEGER データ型について、値の範囲は-99999999999999999999999999999999999999から+99999999999999999999999999999999999999(両端を含む)までの整数値すべてです。

さまざまな名前( TINYINT 、 BYTEINT など)は、他のシステムからの移植を簡単にするためと、指定された型の列に対する予想値の範囲を示唆するためのものです。

ストレージサイズに対する精度とスケールの影響

精度(総桁数)はストレージに影響しません。NUMBER(2,0)と NUMBER(38,0)のように、異なる精度の列における同じ数字のストレージ要件は同じです。Snowflakeは、各マイクロパーティションについて、特定の列の最小値と最大値を決定し、その情報を使用して、パーティションにあるその列に対するすべての値のストレージサイズを決定します。例:

  • 列に -128 から +127 までの値のみが含まれている場合、各値は1バイト(非圧縮)を消費します。

  • 列の最大値が 10000000 の場合、各値は4バイト(非圧縮)を消費します。

ただし、スケール(小数点以下の桁数)はストレージに影響します。たとえば、 NUMBER(10,5)の型の列に格納された同じ値は、 NUMBER(5,0)よりも多くのスペースを消費します。また、スケールの大きな値の処理は、若干遅くなり、より多くのメモリを消費する可能性があります。

スペースを節約するために、Snowflakeは値をストレージに書き込む前に圧縮します。圧縮の量は、データ値やその他の要因によって異なります。

テーブル内の固定小数点データ型の例

次のステートメントは、さまざまな固定小数点データ型の列を持つテーブルを作成します。

CREATE OR REPLACE TABLE test_fixed(
  num0 NUMBER,
  num10 NUMBER(10,1),
  dec20 DECIMAL(20,2),
  numeric30 NUMERIC(30,3),
  int1 INT,
  int2 INTEGER);

DESC TABLE test_fixed;
Copy
+-----------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name      | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|-----------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| NUM0      | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| NUM10     | NUMBER(10,1) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| DEC20     | NUMBER(20,2) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| NUMERIC30 | NUMBER(30,3) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| INT1      | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| INT2      | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
+-----------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+

浮動小数点数のデータ型

Snowflakeは、浮動小数点数に対して次のデータ型をサポートしています。

FLOAT , FLOAT4 , FLOAT8

FLOAT、 FLOAT4、 FLOAT8 という名前は、他のシステムとの互換性を確保するためです。Snowflakeはこの3つをすべて64ビット浮動小数点数として扱います。

精度

Snowflakeは、倍精度(64ビット) IEEE 754浮動小数点数を使用します。

精度は約15桁です。たとえば、整数の場合、範囲は-9007199254740991から+9007199254740991(-253 + 1から+253 - 1)です。浮動小数点値の範囲は、およそ10-308 から10+308 です。Snowflakeは、約10-324 と10-308 の間のより極端な値を、より低い精度で表すことができます。詳細については、 倍精度数に関するウィキペディアの記事 をご参照ください。

Snowflakeは固定小数点データ型 NUMBER をサポートしているため、指数の範囲は狭くなりますが、精度が向上します。

特別な価値

Snowflakeは、 FLOAT に対して次の特別な値をサポートしています。

  • 'NaN' (非数)

  • 'inf' (無限大)

  • '-inf' (負の無限大)

記号 'NaN''inf'、および '-inf' は一重引用符で囲む必要があり、大文字と小文字は区別されません。

'NaN' の比較セマンティクスは、次の点で IEEE 754標準と異なります。

条件

Snowflake

IEEE 754

コメント

'NaN' = 'NaN'

TRUE

FALSE

Snowflakeでは、 'NaN' の値はすべて等しくなります。

'NaN' > X .X はいずれかの FLOAT の値であり、 . 無限( NaN 自体を除く)を含みます。

TRUE

FALSE

Snowflakeでは、 'NaN'. 無限大を含め、 . 他のどの FLOAT 値よりも大きくなります。

丸め誤差

浮動小数点操作には、最下位桁に小さな丸めエラーが生じることがあります。丸めエラーは、三角関数、統計関数、地理空間関数を含む、あらゆるタイプの浮動小数点処理で発生する可能性があります。

以下のリストは、丸めエラーに関する注意事項を示しています。

  • エラーは、クエリが実行されるたびに変わる可能性があります。

  • オペランドの精度やスケールが異なると、エラーが大きくなる可能性があります。

  • 特に集計関数(例: SUMAVG )が大量の行を処理する場合は、エラーが蓄積する可能性があります。集約する前に固定小数点データ型にキャストすると、これらのエラーを削減または排除できます。

  • 丸めエラーは、 SQL を操作する場合だけではなく、Snowflake内で実行される他のコード(例: Java、 JavaScript 、またはPython)を操作する場合にも発生する可能性があります(例: UDFs および ストアドプロシージャ )。

  • 2つの浮動小数点数を比較する場合、Snowflakeは、正確な等式ではなく、近似的な等式を比較することをお勧めします。

正確な DECFLOAT データ型を使用すると、これらの型の近似エラーを回避できる場合があります。

DOUBLE , DOUBLE PRECISION , REAL

FLOAT と同義語です。

テーブル内の浮動小数点データ型の例

次のステートメントは、さまざまな浮動小数点データ型の列を持つテーブルを作成します。

CREATE OR REPLACE TABLE test_float(
  double1 DOUBLE,
  float1 FLOAT,
  dp1 DOUBLE PRECISION,
  real1 REAL);

DESC TABLE test_float;
Copy
+---------+-------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name    | type  | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|---------+-------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| DOUBLE1 | FLOAT | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| FLOAT1  | FLOAT | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| DP1     | FLOAT | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
| REAL1   | FLOAT | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
+---------+-------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+

注釈

DESC TABLE コマンドの type 列は、 FLOAT だけでなく、 FLOAT の同義語(例: DOUBLE 、 DOUBLE 、 PRECISION 、 REAL )に対しても、データ型 FLOAT を表示します。

DECFLOAT

浮動小数点( DECFLOAT )データ型は、最大38桁の有効数の精度で数値を正確に保存し、非常に大きな値または小さな値を表すために動的な10進法の指数を使用します。指数の範囲は-16383から16384で、およそ-10^(16384)と10^(16384)の間の値を許可します。DECFLOAT データ型は可変スケールをサポートしており、格納されている特定の値に応じてスケールが異なります。値を近似値として表す FLOAT データ型と対照的に、 DECFLOAT データ型は、指定された精度で正確な値を表します。

DECFLOAT データ型は以下の 特別な値 をサポートしていません。これらは FLOAT データ型( 'NaN' (非数値)、 'inf' (無限大)、および '-inf' (負の無限大))によってサポートされています。

DECFLOAT データ型のユースケース

正確な小数点の結果と、同じ列で幅広い変数スケールが必要な場合は、 DECFLOAT データ型を使用します。

DECFLOAT データ型は、次の一般的なユースケースに適しています。

  • データをインジェストしていて、受信数値のスケールが不明または大きなばらつきがある場合。

  • 正確な数値(例:台帳、税金、コンプライアンスなど)が必要な場合。

  • IEEE 754小数点表現または128ビット小数点に依存するシステムから移行する場合。これらの移行は、他のSnowflakeデータ型の精度または範囲の制限によってブロックされる可能性があります。

  • 高い精度の数値を合計、乗算、除算するときに、 Number out of representable range エラーを回避したいとします。

たとえば、以下の特定のユースケースに対して DECFLOAT データ型を使用します。

  • Oracle DECIMAL または DB2DECFLOAT 列から不均一にスケールされたデータをインジェストしている場合。

  • 予測が困難な結果のスケールで計算を行う財務モデリングを実行している場合。

  • ナノ単位から桁外れに大きな単位まで幅のある科学的測定を実行している場合。

固定スケールの数値列には NUMBER データ型、不正確な結果が許容される高スループット分析には FLOAT データ型を引き続き使用できます。

DECFLOAT データ型の使用上の注意

  • 操作により38桁以上の結果が生成された場合、 DECFLOAT 値は38桁の精度に丸められ、現在の丸めモードに従って最下位の数字が切り捨てられます。Snowflakeは、 DECFLOAT 値に 四捨五入モード を使用します。

  • DECFLOAT 値を指定した場合、または DECFLOAT 値にキャストした場合、 SQL で数値文字列の使用を回避します。SQL で数値リテラルを使用すると、値は DECFLOAT 値にキャストされる前に NUMBER または FLOAT 値として解釈され、範囲エラーが発生したり、精度が失われたりする可能性があります。代わりに、 SELECT '<value>'::DECFLOAT などの文字列リテラル、または DECFLOAT リテラル( SELECT DECFLOAT '<value>' など)のいずれかを使用します。

  • 操作に DECFLOAT 値と他の数値型の値が混在する場合、強制は DECFLOAT 値を好みます。たとえば、 NUMBER 型および DECFLOAT 型の値を追加した場合、結果は DECFLOAT 値になります。

  • DECFLOAT 型の使用により、ストレージの消費が増加する可能性があります。

DECFLOAT データ型をサポートするドライバーとドライバーバージョン

次のSnowflake ドライバーとドライバーバージョンは DECFLOAT データ型をサポートしています。ドライバーを DECFLOAT をサポートするバージョンにアップデートすることをお勧めします。

ドライバー

サポートされている最小バージョン

メモ

Python用Snowflakeコネクタ

3.14.1

pandas DataFrames は DECFLOAT 型をサポートしていません。

ODBC

3.12.0

なし。

JDBC

3.27.0

なし。

Go Snowflakeドライバー

1.17.0

なし。

SQL API

2.0.0

なし。

サポートされていないドライバーは DECFLOAT 値を TEXT 値として処理します。一部のドライバーでは、 DECFLOAT 型を言語ネイティブ型にマップするためにドライバーパラメーターを設定する必要があります。詳細については、 ドライバー をご参照ください。

DECFLOAT データ型の制限

DECFLOAT 型には以下の制限が適用されます。

  • DECFLOAT値は、 半構造化データ型 または 構造化データ型 として保存できません。

    DECFLOAT値をこれらの型のいずれかの文字列として保存するには、DECFLOAT値をVARCHAR値に キャスト できます。

  • DECFLOAT 値は以下のテーブルの型ではサポートされていません。

    • Icebergなどの外部形式のテーブル

    • ハイブリッドテーブル

  • DECFLOATデータ型はストアドプロシージャ、またはPythonやJavaなどのSQL以外の言語で書かれているユーザー定義関数(UDFs)でサポートされていません。

  • DECFLOAT データ型はSnowflakeではサポートされていません。

  • Snowsightでは DECFLOAT データ型のサポートは限定されています。

  • 次の機能は DECFLOAT データ型をサポートしていません。

  • NUMBER および FLOAT 型は DECFLOAT 型よりも優れたパフォーマンスを提供することがあります。

DECFLOAT データ型の例

以下の例では、 DECFLOAT データ型を使用しています。

DECFLOAT および FLOAT の違いを表示する

次の例は、 DECFLOAT および FLOAT データ型の違いを示しています。

  1. DECFLOAT 列と FLOAT 列を含むテーブルを作成し、テーブルの両方の型に同じ値を挿入します。

    CREATE OR REPLACE TABLE decfloat_sample (
      id INT,
      decfloat_val DECFLOAT,
      float_val FLOAT);
    
    INSERT INTO decfloat_sample VALUES
      (
        1,
        DECFLOAT '123e7000',
        FLOAT '123e7000'
      ),
      (
        2,
        12345678901234567890123456789::DECFLOAT,
        12345678901234567890123456789::FLOAT
      ),
      (
        3,
        '-4.2e-5432'::DECFLOAT,
        '-4.2e-5432'::FLOAT
      ),
      (
        4,
        '1.00000000000000000000000000000000000014'::DECFLOAT,
        '1.00000000000000000000000000000000000014'::FLOAT
      ),
      (
        5,
        '1.00000000000000000000000000000000000015'::DECFLOAT,
        '1.00000000000000000000000000000000000015'::FLOAT
      );
    
    Copy

    このステートメントは次のように DECFLOAT 値を挿入します。

    • 最初の値は DECFLOAT リテラルを使用して挿入されます。

    • 2番目の値は INTEGER 値を DECFLOAT 値にキャストすることにより挿入されます。

    • 3番目、4番目、5番目の値は、 VARCHAR 値を DECFLOAT 値にキャストすることによって挿入されます。

  2. 型を表示するには、 DESC TABLE コマンドを使用してテーブルを記述します。

    どちらの列のテーブル定義でも精度が指定されませんでしたが、出力では DECFLOAT データ型は最大38桁の有効数の精度をサポートしていることが表示されます。

    DESC TABLE decfloat_sample;
    
    Copy
    +--------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
    | name         | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
    |--------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
    | ID           | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
    | DECFLOAT_VAL | DECFLOAT(38) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
    | FLOAT_VAL    | FLOAT        | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
    +--------------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
    
  3. 値の違いを表示するには、 SELECT ステートメントを使用してテーブルをクエリします。

    SELECT * FROM decfloat_sample;
    
    Copy
    +----+-----------------------------------------+------------------------+
    | ID | DECFLOAT_VAL                            |              FLOAT_VAL |
    |----+-----------------------------------------+------------------------|
    |  1 | 1.23e7002                               | inf                    |
    |  2 | 12345678901234567890123456789           |   1.23456789012346e+28 |
    |  3 | -4.2e-5432                              |  -0                    |
    |  4 | 1.0000000000000000000000000000000000001 |   1                    |
    |  5 | 1.0000000000000000000000000000000000002 |   1                    |
    +----+-----------------------------------------+------------------------+
    

    出力は以下の違いを示しています。

    • 最初の行は、 DECFLOAT 型は FLOAT 型よりも広い範囲の値をサポートしていることを示しています。DECFLOAT 値は非常に大きいです( 1.23e7002 )。FLOAT 値は inf です。これは、値が FLOAT 型が表すことができる値よりも大きいことを意味します。

    • 2行目は、 DECFLOAT 型が指定された値を正確に保持することを示しています。FLOAT 値 は、科学的表記法で保存される近似値です。

    • 3行目は、 DECFLOAT 型が非常に小さな値( -4.2e-5432 )をサポートしていることを示しています。FLOAT 値は -0 の近似値です。

    • 4行目と5行目は、 DECFLOAT 型が最大38桁の精度をサポートし、制限を超えた値には丸めルールを使用することを示しています。FLOAT 値は両方の行で 1 の近似値です。

DECFLOAT 値と集計関数を使用する

次の例では、 DECFLOAT 値と集計関数を使用しています。

  1. テーブルを作成して、 DECFLOAT 値をテーブルに挿入します。

    CREATE OR REPLACE TABLE decfloat_agg_sample (decfloat_val DECFLOAT);
    
    INSERT INTO decfloat_agg_sample VALUES
      (DECFLOAT '1e1000'),
      (DECFLOAT '-2.47e999'),
      (DECFLOAT '22e-75');
    
    Copy
  2. いくつかの集計関数を使用してテーブルをクエリします。

    SELECT SUM(decfloat_val),
           AVG(decfloat_val),
           MAX(decfloat_val),
           MIN(decfloat_val)
      FROM decfloat_agg_sample;
    
    Copy
    +-------------------+-------------------+-------------------+-------------------+
    | SUM(DECFLOAT_VAL) | AVG(DECFLOAT_VAL) | MAX(DECFLOAT_VAL) | MIN(DECFLOAT_VAL) |
    |-------------------+-------------------+-------------------+-------------------|
    | 7.53e999          | 2.51e999          | 1e1000            | -2.47e999         |
    +-------------------+-------------------+-------------------+-------------------+
    

数値定数

定数 (別称 リテラル )とは、固定データ値のことです。数値定数では、次の形式がサポートされています。

[+-][digits][.digits][e[+-]digits]

条件:

  • + または - は正または負の値を示します。デフォルトは正です。

  • digits は、0から9までの1桁以上です。

  • e (または E)は、科学表記法の指数を示します。指数マーカーが存在する場合は、少なくとも1桁が指数マーカーの後に続く必要があります。

次の数値は、すべてサポートされている数値定数の例です。

15
+1.34
0.2
15e-03
1.234E2
1.234E+2
-1