算術演算子

算術演算子は、1つ以上の入力式から数値出力を生成するために使用されます。

次の場合を除き、入力式は数値(固定小数点または浮動小数点)でなければなりません。

  • 単項演算子 + は数値文字列を取ることができますが、これにより文字列は対応する数値に暗黙的に変換されます。

  • 2項演算子 - は DATE 式に適用できます。

このトピックの内容:

算術演算子のリスト

演算子

構文

説明

+ (単項)

+a

a を暗黙的に数値に変換する a を返します。 a が文字列であっても、文字列を数値に変換できない場合は、エラーが返されます。

+

a + b

2つの数値式(a および b)を追加します。

- (単項)

-a

入力数値式を否定します。

-

a - b

ある数式(b)を別の数式(a)から減算します。

-

a - b

1つの日付式(b)を別の日付式(a)から減算します。結果は整数の日数です。DATE 式で許可される唯一の算術演算は、減算です。

*

a * b

2つの数値式(a および b)を乗算します。

/

a / b

1つの数式(a)を別の数式(b)で除算します。0または NULL で割ったときに0を返す関数については、 DIV0DIV0NULL をご参照ください。

%

a % b

b ごとに数値式 a の剰余を計算します。 MOD もご参照ください。

算術演算のスケールと精度

算術演算の出力の スケール および 精度 は、入力のスケールと精度に依存します。

このセクションでは、Snowflakeがさまざまな算術演算(乗算、除算など)によって生成される数値出力のスケールと精度を保持するために使用する計算について説明します。このセクションでは、次の説明が使用されます。

先頭の数字

数値の小数点の左側の桁数(L)です。

スケール

数値の小数点の右側の桁数(S)です。

精度

数値の合計桁数(P)で、先頭の桁とスケールの合計として計算されます(P = L + S)。Snowflakeの精度は常に38に制限されています。

関連項目:

  • 固定小数点データ型(NUMBER、 DECIMALなど)は、精度とスケールを利用します。例えば、 DECIMAL(8、2)データ型の場合、精度は8、スケールは2、先頭桁は6です。

  • 浮動小数点データ型(FLOAT、 DOUBLE、 REALなど)は、8バイトの倍精度を利用します。

出力の場合、これらは最大桁数になります。特定の出力の実際の桁数はこれより少ない場合があります。

乗算

乗算を実行する場合:

  • 出力の先頭桁の数は、両方の入力の先頭桁の合計です。

  • Snowflakeは、入力のいずれかが12より大きいスケールを持たない限り、両方の入力のスケールに最大入力しきい値12桁までの桁数を追加することにより、潜在的なオーバーフロー(連鎖乗算による)を最小限に抑えます。入力のいずれかが12より大きいスケールの場合は、大きな入力スケールを出力スケールとして使用します。

つまり、2つの入力(L1.S1 および L2.S2)を使用した乗算演算を想定すると、出力の最大桁数は次のように計算されます。

先頭の数字

L = L1 + L2

スケール

S = min(S1 + S2, max(S1, S2, 12))

精度

P = L + S

注釈

Snowflakeは数値の整数乗算を実行するため、中間結果がオーバーフローを引き起こす可能性があります。ただし、最終出力はオーバーフローしません。

select 10.01 n1, 1.1 n2, n1 * n2;

+-------+-----+---------+
|    N1 |  N2 | N1 * N2 |
|-------+-----+---------|
| 10.01 | 1.1 |  11.011 |
+-------+-----+---------+

select 10.001 n1, .001 n2, n1 * n2;

+--------+-------+----------+
|     I1 |    I2 |  I1 * I2 |
|--------+-------+----------|
| 10.001 | 0.001 | 0.010001 |
+--------+-------+----------+

select .1 n1, .0000000000001 n2, n1 * n2;

+-----+-----------------+-----------------+
|  N1 |              N2 |         N1 * N2 |
|-----+-----------------+-----------------|
| 0.1 | 0.0000000000001 | 0.0000000000000 |
+-----+-----------------+-----------------+
Copy

除算

除算を実行する場合:

  • 出力の先頭桁は、分子の先頭桁と分母のスケールの合計です。

  • Snowflakeは、分子のスケールが12より大きくない限り、分子のスケールに最大しきい値12桁まで6桁を追加することにより、出力の潜在的なオーバーフロー(連鎖除算による)とスケールの損失を最小限に抑えます。分子のスケールが12より大きい場合は、分子のスケールを出力スケールとして使用します。

つまり、分子 L1.S1 および分母 L2.S2 による除算演算を想定すると、出力の最大桁数は次のように計算されます。

先頭の数字

L = L1 + S2

スケール

S = max(S1, min(S1 + 6, 12))

精度

P = L + S

除算演算の結果が出力スケールを超える場合、Snowflakeは(出力を切り捨てるのではなく)出力を丸めます。

注釈

乗算と同様に、中間除算の結果はオーバーフローを引き起こす可能性があります。ただし、最終出力はオーバーフローしません。

select 2 n1, 7 n2, n1 / n2;

+----+----+----------+
| N1 | N2 |  N1 / N2 |
|----+----+----------|
|  2 |  7 | 0.285714 |
+----+----+----------+

select 10.1 n1, 2.1 n2, n1 / n2;

+------+-----+-----------+
|   N1 |  N2 |   N1 / N2 |
|------+-----+-----------|
| 10.1 | 2.1 | 4.8095238 |
+------+-----+-----------+

select 10.001 n1, .001 n2, n1 / n2;

+--------+-------+-----------------+
|     N1 |    N2 |         N1 / N2 |
|--------+-------+-----------------|
| 10.001 | 0.001 | 10001.000000000 |
+--------+-------+-----------------+

select .1 n1, .0000000000001 n2, n1 / n2;

+-----+-----------------+-----------------------+
|  N1 |              N2 |               N1 / N2 |
|-----+-----------------+-----------------------|
| 0.1 | 0.0000000000001 | 1000000000000.0000000 |
+-----+-----------------+-----------------------+
Copy

加算と減算

加算または減算の場合:

  • 出力の先頭桁は、入力の先頭桁の最大数に1を加えたものです(キャリー値を保持するため)。

  • 出力のスケールは、入力の最大スケールです。

つまり、加算または減算演算に2つの入力(L1.S1 および L2.S2)があると想定すると、出力の最大桁数は次のように計算されます。

先頭の数字

L = max(L1, L2) + 1

スケール

S = max(S1, S2)

精度

P = L + S

その他のN項演算

モジュロ(a % b または MOD)など、複数の数値入力を使用する他のすべての算術演算の場合:

  • 出力の先頭にある数値は、入力の先頭にある数値の最大数です。

  • 出力のスケールは、入力の最大スケールです。

つまり、入力 L1.S1L2.S2 などのN項演算を想定すると、出力の最大桁数は次のように計算されます。

先頭の数字

L = max(L1, L2, ...)

スケール

S = max(S1, S2, ...)

精度

P = L + S

単項演算

単項算術演算は、出力精度を明示的に指定できる ROUND を除き、入力精度とスケールと同じ出力精度とスケールを持ちます。

ビット演算

サポートされているビットごとの算術演算のリストは、 条件式関数 に掲載されています。

注意:

  • 数値の場合、ビット単位の演算は入力の先頭の数字に対してのみ動作します。出力のスケールは常にゼロです。

  • バイナリビット演算の場合、出力の先頭桁数は入力の最大先頭桁数と同じです。