こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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)

投稿日時 - 2008-04-02 19:57:35

QNo.3916659

すぐに回答ほしいです

質問者が選んだベストアンサー

もひとつ補足で質問です。

どんなやり方でSQLを実行したのでしょうか?
( dbaccess ? , isql ?, C , jdbc ... ? )

投稿日時 - 2008-04-04 19:31:44

補足

無事に結果が出ました。
皆様、本当に有難うございました。

どうやらcol[1]に'0'が入っている場合に直に数値変換すると、
一桁ずれ、'/'を数値変換しようとする為、
数値変換エラーとなる模様です。

ですので、べたですが、col[1]に'0'が入っている場合も
数値'0'として、変換するように配慮する事で、
実行する事が出来ました。

それでは、良い週末を。

投稿日時 - 2008-04-04 22:46:02

お礼

回答、有難うございます。
少々、気づいた点があり、調査してみました。

まず、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'までしか入っていません。

んー。
もう少しのような気がします。

投稿日時 - 2008-04-04 22:28:32

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(7)

ANo.6

Informix 製品のバージョンは何ですか?

それから、先ほど書いたSQL ( Create table, insert, select ) をそのまま実行した場合にはどうなりますか?

投稿日時 - 2008-04-04 19:30:05

お礼

回答、有難うございます。
Informixのバージョンは調査します。
今暫く、お待ち下さい。

前出のSQLですが、Linux上のアプリからの実行は、SELECTのみ実行を許可されており、CREATEやINSERT等の更新SQLは不可能でした。

投稿日時 - 2008-04-04 20:30:31

ANo.5

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;

投稿日時 - 2008-04-04 12:05:13

お礼

回答、有難うございます。

早速、チェックしましたが、上記の結果と同じく、
文字列から数値変換エラーと表示し、実行出来ません。

明示・暗黙ともに実行不可能といった状況です。

どのような事でも結構です。
気付かれた点のコメントをお願いします。

投稿日時 - 2008-04-04 16:10:32

ANo.4

CAST('20080101' as DECIMAL)
では、いかがですか?
20080101 は、INTは無理でしょう。

投稿日時 - 2008-04-04 02:18:27

お礼

回答、有難うございます。

コメントの通り、'20080101'という文字列を数値型に変換する点は、
DECIMALで実行出来ています。

しかしながら、'20080101'に成型する為に、「SUBSTRING」や「colums[7,8]」等の文字列操作関数や任意抽出を使用せざるを得ず、関数使用し、成型した後の数値変換が出来ない状態です。

引き続き、アドバイスをお願いします。

投稿日時 - 2008-04-04 16:03:38

ANo.3

> 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
を試してみてください。

投稿日時 - 2008-04-03 19:27:24

お礼

回答、有難うございます。
Informixに接続している言語は、恥ずかしながら不明です。

確かにバッチ処理で使用しているAWKプログラムでは、
文字列から数値変換は出来ているのですが、
今回の要望がUI画面からの操作であり、Informix-SQLの柔軟性に困っています。

尚、DECIMALでもダメでした…。

投稿日時 - 2008-04-04 15:58:17

ANo.2

お使いの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
でも駄目ですか?

投稿日時 - 2008-04-03 10:44:47

お礼

回答、有難うございます。
早速、試しましたが、「文字列から数値変換失敗」と表記され、実行出来ませんでした。

通常のInformixであれば、アドバイスの通り、明示的CASTで実行可能なでしょうが、当方の環境はLinux上のパッケージソフト内に同梱されているInformixなので、MSDEのようなエンジン的な機能しか無いのかも知れません…。

何とかしたいのですが、助けて下さい。

投稿日時 - 2008-04-03 18:09:50

ANo.1

CAST('20080101' as INTEGER )
では駄目ですか?

投稿日時 - 2008-04-03 00:02:26

お礼

アドバイス、有難うございます。
結果は、「Character to numeric conversion error」となり、
実行出来ません。

もともとの01/01/08領域を定義している型は「Char(41)」なのですが、これが問題なのでしょうか?
又、この定義型の変更は出来ません。

引き続き、宜しくお願いします。

投稿日時 - 2008-04-03 09:42:37

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-