数値データ型

This topic describes the numeric data types supported in Snowflake, along with the supported formats for numeric constants and literals.

固定小数点数のデータ型

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

NUMBER

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

精度:

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

スケール:

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

By default, precision is 38, and scale is 0; that is, NUMBER(38, 0). Precision limits the range of values that can be inserted into or cast to columns of a given type. For example, the value 999 fits into NUMBER(38,0) but not into NUMBER(2,0).

Because precision is the total number of digits allowed, you can't load a value into a NUMBER column if the number of digits to the left of the decimal point exceeds the precision of the column minus its scale. For example, NUMBER(20, 2) allows 18 digits on the left side of the decimal point and two digits on the right side of the decimal point, for a total of 20 digits.

The maximum scale, which is the number of digits to the right of the decimal point, is 37. Numbers that have fewer than 38 significant digits, but whose least significant digit is past the 37th decimal place --- for example, 0.0000000000000000000000000000000000000012 (1.2e-39) --- can't be represented without losing some digits of precision.

注釈

If data is converted to another data type with lower precision, and then converted back to the higher-precision data type, the data can lose precision. For example, precision is lost if you convert a NUMBER(38,37) value to a DOUBLE value --- which has a precision of approximately 15 decimal digits --- and then back to NUMBER.

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

DECIMAL , DEC , NUMERIC

NUMBERと同義語です。

INT , INTEGER , BIGINT , SMALLINT , TINYINT , BYTEINT

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

The various names --- for example, TINYINT, BYTEINT, and so on ---are to simplify porting from other systems and to suggest the expected range of values for a column of the specified type.

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

Precision --- the total number of digits --- doesn't affect storage. The storage requirements for the same number in columns with different precisions, such as NUMBER(2,0) and NUMBER(38,0), are the same. For each micro-partition, Snowflake determines the minimum and maximum values for a given column and uses that information to determine the storage size for all values for that column in the partition. For example:

  • If a column contains only values between -128 and +127, each of the values consumes 1 byte (uncompressed).

  • If the largest value in the column is 10000000, each of the values consumes 4 bytes (uncompressed).

However, scale --- the number of digits following the decimal point --- affects storage. For example, the same value stored in a column of type NUMBER(10,5) consumes more space than NUMBER(5,0). Also, processing values with a larger scale might be slightly slower and consume more memory.

スペースを節約するために、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浮動小数点数を使用します。

Precision is approximately 15 digits. For example, for integers, the range is from -9007199254740991 to +9007199254740991 (-253 + 1 to +253 - 1). Floating-point values can range from approximately 10-308 to 10+308. Snowflake can represent more extreme values between approximately 10-324 and 10-308 with less precision. For more details, see the Wikipedia article on double-precision numbers.

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

特別な価値

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

  • 'NaN' (非数)

  • 'inf' (無限大)

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

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

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

条件

Snowflake

IEEE 754

コメント

'NaN' = 'NaN'

TRUE

FALSE

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

'NaN' > X . where X is any FLOAT value, including . infinity, other than NaN itself.

TRUE

FALSE

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

丸め誤差

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

The following list shows considerations for rounding errors:

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

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

  • Errors can accumulate, especially when aggregate functions ---for example, SUM or AVG --- process large numbers of rows. Casting to a fixed-point data type before aggregating can reduce or eliminate these errors.

  • Rounding errors can occur not only when working with SQL, but also when working with other code --- for example, Java, JavaScript, or Python --- that runs inside Snowflake --- for example, in UDFs and stored procedures.

  • 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           |
+---------+-------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+

注釈

The DESC TABLE command's type column displays the data type FLOAT not only for FLOAT, but also for synonyms of FLOAT; for example, DOUBLE, DOUBLE PRECISION, and REAL.

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 Driver

1.17.0

なし。

SQL API

2.0.0

なし。

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

DECFLOAT データ型の制限

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

  • DECFLOAT 値は VARIANT 、 OBJECT または ARRAY 値に保存できません。DECFLOAT 値を VARIANT 値にキャストするには、最初に VARCHAR 値にキャストし、それを VARIANT 値にキャストします。

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

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

    • ハイブリッドテーブル

  • DECFLOAT データ型はSnowflake Scriptingのストアドプロシージャではサポートされていません。ただし、Snowflake Scriptingのユーザー定義関数( UDFs )ではサポートされています。

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

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

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

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

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

Examples for the DECFLOAT data type

以下の例では、 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         |
    +-------------------+-------------------+-------------------+-------------------+
    

数値定数

The term constants --- also known as literals --- refers to fixed data values. The following formats are supported for numeric constants:

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

条件:

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

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

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

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

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