• ベストアンサー

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)

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

  • ベストアンサー
  • mikinyuu
  • ベストアンサー率100% (1/1)
回答No.7

もひとつ補足で質問です。 どんなやり方でSQLを実行したのでしょうか? ( dbaccess ? , isql ?, C , jdbc ... ? )

sizeofgoo
質問者

お礼

回答、有難うございます。 少々、気づいた点があり、調査してみました。 まず、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'までしか入っていません。 んー。 もう少しのような気がします。

sizeofgoo
質問者

補足

無事に結果が出ました。 皆様、本当に有難うございました。 どうやらcol[1]に'0'が入っている場合に直に数値変換すると、 一桁ずれ、'/'を数値変換しようとする為、 数値変換エラーとなる模様です。 ですので、べたですが、col[1]に'0'が入っている場合も 数値'0'として、変換するように配慮する事で、 実行する事が出来ました。 それでは、良い週末を。

その他の回答 (6)

  • mikinyuu
  • ベストアンサー率100% (1/1)
回答No.6

Informix 製品のバージョンは何ですか? それから、先ほど書いたSQL ( Create table, insert, select ) をそのまま実行した場合にはどうなりますか?

sizeofgoo
質問者

お礼

回答、有難うございます。 Informixのバージョンは調査します。 今暫く、お待ち下さい。 前出のSQLですが、Linux上のアプリからの実行は、SELECTのみ実行を許可されており、CREATEやINSERT等の更新SQLは不可能でした。

  • mikinyuu
  • ベストアンサー率100% (1/1)
回答No.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;

sizeofgoo
質問者

お礼

回答、有難うございます。 早速、チェックしましたが、上記の結果と同じく、 文字列から数値変換エラーと表示し、実行出来ません。 明示・暗黙ともに実行不可能といった状況です。 どのような事でも結構です。 気付かれた点のコメントをお願いします。

  • IfmxUser
  • ベストアンサー率0% (0/1)
回答No.4

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

sizeofgoo
質問者

お礼

回答、有難うございます。 コメントの通り、'20080101'という文字列を数値型に変換する点は、 DECIMALで実行出来ています。 しかしながら、'20080101'に成型する為に、「SUBSTRING」や「colums[7,8]」等の文字列操作関数や任意抽出を使用せざるを得ず、関数使用し、成型した後の数値変換が出来ない状態です。 引き続き、アドバイスをお願いします。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.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 を試してみてください。

sizeofgoo
質問者

お礼

回答、有難うございます。 Informixに接続している言語は、恥ずかしながら不明です。 確かにバッチ処理で使用しているAWKプログラムでは、 文字列から数値変換は出来ているのですが、 今回の要望がUI画面からの操作であり、Informix-SQLの柔軟性に困っています。 尚、DECIMALでもダメでした…。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.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 でも駄目ですか?

sizeofgoo
質問者

お礼

回答、有難うございます。 早速、試しましたが、「文字列から数値変換失敗」と表記され、実行出来ませんでした。 通常のInformixであれば、アドバイスの通り、明示的CASTで実行可能なでしょうが、当方の環境はLinux上のパッケージソフト内に同梱されているInformixなので、MSDEのようなエンジン的な機能しか無いのかも知れません…。 何とかしたいのですが、助けて下さい。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

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

sizeofgoo
質問者

お礼

アドバイス、有難うございます。 結果は、「Character to numeric conversion error」となり、 実行出来ません。 もともとの01/01/08領域を定義している型は「Char(41)」なのですが、これが問題なのでしょうか? 又、この定義型の変更は出来ません。 引き続き、宜しくお願いします。

関連するQ&A

  • 文字列から数値を抽出したいのですが・・。

    文字列から数値(integer型)を抽出したいのですが、うまくいきません。 val関数だと文字の途中の数値が判別できないし、困っています。 よろしくお願いします。 ※以下、文字列と数値の関係です。 ・"文字列" → 抽出したい数値  "0k,abc,5k,abc3.0" → 0530  "abc()_3t" → 3

  • SQLで文字列を時刻に型変換する方法

    SQLで文字列を時刻に型変換する方法を教えていただきたいです。 char型のAというカラムに'090000'が格納されています。 この値を time型のBというカラムに型変換して登録したいのですが、 cast(A as time) としてもエラーが出てしまうので、現在は cast(SubString(A,1,2)+':'+SubString(A,3,2)+':'+SubString(A,5,2) as time) と変換しています。 もっと簡単に変換する方法はありますでしょうか? ご教示頂けましたら、助かります。 宜しくお願い致します。

  • 数値を含む文字列の並び替えについて

    $xxxx[0]='なんとかかんとか'."\t".'なんとかかんとか'."\t".'12345'."\t".'なんとかかんとか'; $xxxx[1]='うんたらかんたら'."\t".'うんたらかんたら'."\t".'12346'."\t".'うんたらかんたら'; … のように、数値がタブ区切りで中間に入った文字列が幾つかあります。 この文字列を数値の部分で比較し並び替えることは可能でしょうか? 数値の位置は固定、3番目です。 よろしくお願いします。

    • 締切済み
    • PHP
  • 数値を文字列に変換する方法

    int rssi_dec = Convert::ToInt32("0X" + test02, 16); -----------(中略)----------------------- 一度、文字列だったものを数値に変換して、中略部分で計算をして、もう一度数値をHEXの 文字列に変換して、 String^ test このtestの中に代入したいと思っているのですが、どのようにすればよいのでしょうか? どうぞ、ご教授よろしくお願い致します。

  • EXCEL 数値と文字列の共存

    凄く初歩的な質問だとは思うのですが解決出来なくて困っています。 ユーザーフォーム上のテキストボックスから セルに入力をする時に 485768 っと数値を入力すると入力はされますが 「数値が文字列として入力されています」 とエラーが出てしまします。 これだけなら「str」ってのを使うと解決するのですが その同じテキストボックスで 3RD-544 のような文字列も入力します。 これだと「str」だとエラーが出てしまいます。 しかし「val」で解決します。 でも、すると数値のみの時にエラーが出てしまします。 ・・・要するに文字列もしくは標準で入力したいのです。 if構文で数値の時は「str」、文字列の時は「val」 のように凄く回りくどくやれば出来そうな気はするのですが もっとさくっと出来る方法はないでしょうか?

  • 数値を文字列として結合した結果を数値に変換する

    お世話になっております。 プログラムで、文字を結合した結果を数値に変換する処理にて 処理を高速化できる記述方法があるか質問させてください。 ・やりたいこと  複数の数値を文字列として結合した結果を数値型に高速で変換したい。 ・現在のコード(考え方 C#にて)  今、以下のように数値変換しているのですが、  これ以外の書き方で、スマートな方法はないでしょうか?  ※結果がわかりやすいように変数はその都度宣言しています。 int i1 = "10"; int i2 = "2"; string sConcat = i1.ToString() + i2.ToString() ; // "102" // To Int int convertedInt = int.Parse( sConcat ) ; //102 // To Hex int convertedHex = Convert.ToInt32( sConcat , 16 ); // 0x102 数値を文字にして結合して・・・またキャストというのが 無駄なような気がしています。 すみませんが、良い方法があればご教授ください。

  • intの数値を文字列に変換

    intの数値を文字列に変換したいのですが環境が ファームウェア、ライブラリのitoaやsprintfが使用出来ません。 どの様にすれば返還出来るでしょうか?

  • 文字列のカラムを数字と比較したい

    sqlserver2005 文字列のカラム(ただし数字のみ)と、画面から文字列としてきた 数字の大小を比較したいと思っています。 たとえば、WHERE ~ 【対象カラム】 > CONVERT(NUMERIC,'1')のように しようと思っていたのですが、この場合、【対象カラム】の中に 空白があるとこけてしまいます。 文字列なので、空がNULLとは限らないため困っています。 そもそもINT型のカラムならば良いのですが、都合により文字列の カラムにするしかなく。 妙案ありましたらアドバイスいただけないでしょうか。

  • 文字列の加算

    OS  :WindowsXP Pro SP1 開発環境:VisualStudio .NET 2003 開発言語:C# 開発形態:Windowsアプリケーション プログラミング初心者です。どうかよろしくお願い致します。 現在、あるアプリケーションを作成しております。 その中で、数値の入った文字列を受け取り、それを全て加算しようとしております。 例えば、 引数の文字列が"123456789"だとしたら、そのメソッド内で1+2+3+4+5+6+7+8+9を計算し、答えを返却値とする。 私は文字列をint型にキャストして計算しようと思ったのですが、うまくキャストできません。string型はint型にキャストできないのでしょうか? また他に文字列の数値の加算をする方法がありましたら、どなたかご教授お願い致します。

  • 数値を文字列に変換する?

    下のプログラムでなぜString ss= " "+dt;のように数値を文字列に変換しないとだめなんでしょうか? ちなみに桁数設定メソッドを作るプログラムです。 public class JcWidth { // JcWidth.java [java] public static void main(String args[]) { System.out.println(":" + toIntWidth(123, 8) + ":"); System.out.println(":" + toIntWidth(12345, 8) + ":"); System.out.println(":" + toIntWidth(-1234567890, 8) + ":"); System.out.println(":" + toHexWidth(4095, 8) + ":"); System.out.println(":" + toHexWidth(123456789, 8) + ":"); } // int値dtを先行空白付きw桁(最大12)の表現にする // 数値が指定幅より大きいときは必要な幅にする public static String toIntWidth(int dt, int w) { if (w > 12) w = 12; String ss = "" + dt; // 数値を文字列にする if (ss.length() > w) w = ss.length(); ss = " " + dt; return ss.substring(ss.length()-w); } // int値dtを先行0付きw桁(最大8)の16進数大文字表現にする public static String toHexWidth(int dt, int w) { if (w > 8) w = 8; String ss = Integer.toHexString(dt).toUpperCase(); if (ss.length() > w) w = ss.length(); ss = "0000000" + ss; return ss.substring(ss.length()-w); } } 

    • ベストアンサー
    • Java