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の最大値を超える値をいれると、「 フィールド 'INT' に不正な値が指定されています: 2147483648」というエラーになりました。
演算の最大はBIGINT
以下を足しこんでみました。
LONGの最大値:2147483647
LONGの最大値+1:2147483648
BIGINTの最大値:9223372036854775807
結果としてはLONGを超えてもBIGINTの最大値までは正しく演算できています。
一方で、BIGINTの最大値を超える「1+BIGINTの最大値」の演算結果は「-9223372036854775808」というBIGINTの最小値になってしまっておかしな結果になっています。オーバーフローしたためと思われます。
なお、値として「BIGINTの最大値+1」を足しこもうとすると「AEQMJ0422E: CLEM エラー: 次の式の数値 '9223372036854775808' は範囲外です: INT+9223372036854775808」でCLEM式自体がエラーになります。
Db2 INEGER型とBIGINT型の読み込み
以下のようなテーブルをDB2に用意しました。
create table LARGEINT(LI INTEGER, BI BIGINT);
INSERT INTO LARGEINT VALUES(2147483647,9223372036854775807);
どちらも整数型として問題なく読めています。ユーザー入力と異なり、BIGINTのサイズのデータも整数型として問題なく認識できています。
Db2 INEGER型とBIGINT型の演算も可能
以下のようなテーブルをDB2に用意しました。元の値は0です。
create table INT0TEST(LI INTEGER, BI BIGINT);
INSERT INTO INT0TEST VALUES(0,0);
しかしながら、以下のようにもともと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);
演算前にLONGの範囲が超えることがわかっている場合はDb2が自動的にBIGINTに型を変えているのですが、演算前にそれがわからない場合はLONG型のままなのでエラーになるようです。
これを回避するためには、いったんto_stringをかけてからto_integerをすることでBIGINT型にして演算すればOKです。
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は文字型扱いになりました。
列BIについてはto_integerで変換することによって整数型にすることができます。
SQLを確認してみると「CAST(T0.BI AS BIGINT) AS BI」でBIGINTに変換しています。
BIGINTの範囲を超えてしまう列LN31はto_integerしようとすると、「CAST(T0.LN31 AS BIGINT) AS LN31 」がOverflow(SQL0413N Overflow occurred during numeric data type conversion. SQLSTATE=22003)で失敗します。
to_numberをつかうと連続型にはなりますが、浮動小数点型になってしまいます。
そのため浮動小数点誤差が発生してしまい、元のデータを維持することができません。やはりBIGINT以上の整数は扱えないということになります。
サンプル
-
テスト環境
- Modeler 18.5
- Windows 11 64bit
- Db2 Warehouse on Cloud
-
サンプルストリーム
参考
Db2の数値型 - IBM Documentation