- ベストアンサー
Informixで文字列を数値型に
こんにちは。 当方、Linux7.3+アプリケーション(DB:Informix)を使用しています。 文字列を数値に変換するSQLに悩まされています。 内容 01/01/08からなる文字列と20080101と手動入力される数値を比較する事が最終目標です。 当方が試みている方向は、 01/01/08をSUBSTRING()で20080101に成型し、数値比較をしたい、と思っています。 SUBSTRING()で、文字列型で20080101までできるのですが、数値型にCASTが出来ません。 検討した関数は、下記の通りですが、構文エラーとなり、実装できません。 お助け下さい。 CAST(20080101) as INTEGER TO_NUMBER(20080101) INT(20080101) CONVERT(20080101)
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
もひとつ補足で質問です。 どんなやり方でSQLを実行したのでしょうか? ( dbaccess ? , isql ?, C , jdbc ... ? )
その他の回答 (6)
- mikinyuu
- ベストアンサー率100% (1/1)
Informix 製品のバージョンは何ですか? それから、先ほど書いたSQL ( Create table, insert, select ) をそのまま実行した場合にはどうなりますか?
お礼
回答、有難うございます。 Informixのバージョンは調査します。 今暫く、お待ち下さい。 前出のSQLですが、Linux上のアプリからの実行は、SELECTのみ実行を許可されており、CREATEやINSERT等の更新SQLは不可能でした。
- mikinyuu
- ベストアンサー率100% (1/1)
Informix のバージョンが不明ですが、Linux 7.3 とあったので、V7 でしょうか? Informix V7 だと、明示的なCAST はできないと思いますが、それでも文字列と数値の比較であれば、普通に = などで比較すれば暗黙のキャストが行なわれるのでは? こんなSQL で検索できるようですが。。。 create table testtbl ( col1 char(20), col2 integer ); insert into testtbl values ( '01/01/08', 20080101 ); insert into testtbl values ( '09/03/08', 20080101 ); select '20' || col1[7,8] || col1[1,2] || col1[4,5], col2 from testtbl where '20' || col1[7,8] || col1[1,2] || col1[4,5] = col2;
お礼
回答、有難うございます。 早速、チェックしましたが、上記の結果と同じく、 文字列から数値変換エラーと表示し、実行出来ません。 明示・暗黙ともに実行不可能といった状況です。 どのような事でも結構です。 気付かれた点のコメントをお願いします。
- IfmxUser
- ベストアンサー率0% (0/1)
CAST('20080101' as DECIMAL) では、いかがですか? 20080101 は、INTは無理でしょう。
お礼
回答、有難うございます。 コメントの通り、'20080101'という文字列を数値型に変換する点は、 DECIMALで実行出来ています。 しかしながら、'20080101'に成型する為に、「SUBSTRING」や「colums[7,8]」等の文字列操作関数や任意抽出を使用せざるを得ず、関数使用し、成型した後の数値変換が出来ない状態です。 引き続き、アドバイスをお願いします。
- nora1962
- ベストアンサー率60% (431/717)
> insert into test ( '01/01/08' ) は insert into test values ( '01/01/08' ) の間違いでした。すみません。 しかし、かなり厳しいですね。 informixに接続しているプログラミング言語は何ですか。 場合によっては、言語側で入力された数値を文字列変換できるかもしれません。 後、最後の未練ですが、 select cast( '20' || col1[7,8] || col1[1,2] || col1[4,5] as decimal(13,0) ) from test を試してみてください。
お礼
回答、有難うございます。 Informixに接続している言語は、恥ずかしながら不明です。 確かにバッチ処理で使用しているAWKプログラムでは、 文字列から数値変換は出来ているのですが、 今回の要望がUI画面からの操作であり、Informix-SQLの柔軟性に困っています。 尚、DECIMALでもダメでした…。
- nora1962
- ベストアンサー率60% (431/717)
お使いのinformixのバージョンは? create table test ( col1 char(20) ) insert into test ( '01/01/08' ) select cast( '20' || col1[7,8] || col1[1,2] || col1[4,5] as int8 ) from test でも駄目ですか?
お礼
回答、有難うございます。 早速、試しましたが、「文字列から数値変換失敗」と表記され、実行出来ませんでした。 通常のInformixであれば、アドバイスの通り、明示的CASTで実行可能なでしょうが、当方の環境はLinux上のパッケージソフト内に同梱されているInformixなので、MSDEのようなエンジン的な機能しか無いのかも知れません…。 何とかしたいのですが、助けて下さい。
- nora1962
- ベストアンサー率60% (431/717)
CAST('20080101' as INTEGER ) では駄目ですか?
お礼
アドバイス、有難うございます。 結果は、「Character to numeric conversion error」となり、 実行出来ません。 もともとの01/01/08領域を定義している型は「Char(41)」なのですが、これが問題なのでしょうか? 又、この定義型の変更は出来ません。 引き続き、宜しくお願いします。
お礼
回答、有難うございます。 少々、気づいた点があり、調査してみました。 まず、dbaccessからはCREATEできませんでしたが、 dbaccessのCREATEツールから、コメント通りのテーブルを作り、 INSERT→SELECTと結合する文字列を順に増やし、実行確認しました。 1.WHERE '20'||col1[7,8] = 2008 は問題なく結果が帰ってきます。 2.WHERE '20'||col1[7,8]||col1[1,2] = 200801 は、数値変換エラーとなります。 3.WHERE '20'||col1[7,8]||col1[4,5] = 200801 は問題なく結果が帰ってきます。 4.col1[1,2]に数値となれるデータ以外は入っていません。 '01'~'12'までしか入っていません。 んー。 もう少しのような気がします。
補足
無事に結果が出ました。 皆様、本当に有難うございました。 どうやらcol[1]に'0'が入っている場合に直に数値変換すると、 一桁ずれ、'/'を数値変換しようとする為、 数値変換エラーとなる模様です。 ですので、べたですが、col[1]に'0'が入っている場合も 数値'0'として、変換するように配慮する事で、 実行する事が出来ました。 それでは、良い週末を。