電子書籍の厳選無料作品が豊富!

こんにちは。
当方、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)

A 回答 (7件)

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



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

この回答への補足

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

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

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

それでは、良い週末を。

補足日時:2008/04/04 22:46
    • good
    • 0
この回答へのお礼

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

まず、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

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



それから、先ほど書いたSQL ( Create table, insert, select ) をそのまま実行した場合にはどうなりますか?
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2008/04/04 20:30

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;
    • good
    • 0
この回答へのお礼

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

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

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

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

お礼日時:2008/04/04 16:10

CAST('20080101' as DECIMAL)


では、いかがですか?
20080101 は、INTは無理でしょう。
    • good
    • 0
この回答へのお礼

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

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

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

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

お礼日時:2008/04/04 16:03

> 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
を試してみてください。
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2008/04/04 15:58

お使いの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
でも駄目ですか?
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2008/04/03 18:09

CAST('20080101' as INTEGER )


では駄目ですか?
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2008/04/03 09:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す