4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SPSS Modelerの整数の範囲

Posted at

SPSS Modelerの整数の範囲について調べてみました。

マニュアルには明記がないようです。
https://www.ibm.com/docs/ja/spss-modeler/18.5.0?topic=datatypes-integers

調べた結論としては以下のようです。

  • 表示や演算可能なのはBIGINTの範囲(19桁)
  • ユーザー入力で入力できるのはLONGの範囲(10桁)。演算はBIGINTの範囲で可能
  • Db2のINTEGER型、LONG型は整数型として処理可能。ただし、INTEGER型のデータが演算後にオーバーフローする場合はあらかじめBIGINTに変換しておく必要がある。
  • Db2のDECIMAL型は10桁を超えると文字列型として読み込まれるが、BIGINT(19桁)の範囲まではto_integerで変換して整数として扱うことが可能。それ以上大きい整数は整数として扱うことはできない。

ユーザー入力での最大はLONG

ユーザー入力でLONG範囲のデータは入力できました。
image.png

LONGの最大値を超える値をいれると、「 フィールド 'INT' に不正な値が指定されています: 2147483648」というエラーになりました。

image.png

演算の最大はBIGINT

元データは0と1で用意しました。
image.png

以下を足しこんでみました。
LONGの最大値:2147483647
LONGの最大値+1:2147483648
BIGINTの最大値:9223372036854775807

image.png

結果としてはLONGを超えてもBIGINTの最大値までは正しく演算できています。
一方で、BIGINTの最大値を超える「1+BIGINTの最大値」の演算結果は「-9223372036854775808」というBIGINTの最小値になってしまっておかしな結果になっています。オーバーフローしたためと思われます。

image.png

なお、値として「BIGINTの最大値+1」を足しこもうとすると「AEQMJ0422E: CLEM エラー: 次の式の数値 '9223372036854775808' は範囲外です: INT+9223372036854775808」でCLEM式自体がエラーになります。

image.png

Db2 INEGER型とBIGINT型の読み込み

以下のようなテーブルをDB2に用意しました。

create table LARGEINT(LI INTEGER, BI BIGINT);
INSERT INTO LARGEINT VALUES(2147483647,9223372036854775807);

どちらも整数型として問題なく読めています。ユーザー入力と異なり、BIGINTのサイズのデータも整数型として問題なく認識できています。
image.png

Db2 INEGER型とBIGINT型の演算も可能

以下のようなテーブルをDB2に用意しました。元の値は0です。

create table INT0TEST(LI INTEGER, BI BIGINT);
INSERT INTO INT0TEST VALUES(0,0);

ユーザー入力同様にBIGINTの範囲で演算できています。
image.png

しかしながら、以下のようにもともと1という値が入っていて、演算後にLONGの範囲を超える場合はOverflowのエラー(SQL0802N Arithmetic overflow or other arithmetic exception occurred. SQLSTATE=22003)になりました。

CREATE TABLE INT1TEST(LI INTEGER, BI BIGINT);
INSERT INTO INT1TEST VALUES(1,1);

image.png

image.png

演算前にLONGの範囲が超えることがわかっている場合はDb2が自動的にBIGINTに型を変えているのですが、演算前にそれがわからない場合はLONG型のままなのでエラーになるようです。

これを回避するためには、いったんto_stringをかけてからto_integerをすることでBIGINT型にして演算すればOKです。
image.png

Db2 DECIMAL型の読み込み

RDBでは整数でもDECIMAL型を使うことも多いと思います。Db2の場合最大31桁まで扱えますので、BIGINTよりも大きな整数を扱うことができます。

以下のようなテーブルを作ってみますLIは10桁でLONGの範囲、BIは19桁でBIGINTの範囲、LN31はDECIMALでしか表現できない31桁です。

CREATE TABLE LARGENUMBER(LI DECIMAL(10), BI DECIMAL(19), LN31 DECIMAL(31));
INSERT INTO LARGENUMBER VALUES(1234567890,1234567890123456789,1234567890123456789012345678901);

10桁の列LIは整数型として読まれましたが、列BIと列LN31は文字型扱いになりました。
image.png

列BIについてはto_integerで変換することによって整数型にすることができます。
image.png

SQLを確認してみると「CAST(T0.BI AS BIGINT) AS BI」でBIGINTに変換しています。

image.png

BIGINTの範囲を超えてしまう列LN31はto_integerしようとすると、「CAST(T0.LN31 AS BIGINT) AS LN31 」がOverflow(SQL0413N Overflow occurred during numeric data type conversion. SQLSTATE=22003)で失敗します。

image.png

to_numberをつかうと連続型にはなりますが、浮動小数点型になってしまいます。
image.png

そのため浮動小数点誤差が発生してしまい、元のデータを維持することができません。やはりBIGINT以上の整数は扱えないということになります。
image.png

サンプル

  • テスト環境

    • Modeler 18.5
    • Windows 11 64bit
    • Db2 Warehouse on Cloud
  • サンプルストリーム

参考

Db2の数値型 - IBM Documentation

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?