• ベストアンサー

Oracle SQLで文字列操作

始めまして。 VB6でプログラミングをしています。DBはOracle8.16です。 Oracleテーブル上で、カテゴリー別に " 文字列 & ナンバリング " の値をもつレコードを、インサートしていく作業をしています。 ナンバリングの部分の現在の最大値に1足したものを、 新規レコードで値を持たせインサートしてます。 tblA Col1           Col2 1            NA-P1-1 1            NA-P1-2 1            NA-P1-3 1            NA-P1-4 3            NA-P3-1 3            NA-P3-2 3            NA-P3-3 1   この場合、 Select max(Col2) from tblA where Col1 = 1 で現在のCol1=1のMax値(Col2)は NA-P1-4 と取り出せるできるんですが、新規に追加するレコードのCol2の値が NA-P1-5だと取得できる方法はあるでしょうか。 Select Max(col2)+1 ~だと、カラム定義がvarchar2なんで、 当然のようにシステムに怒られました(当然ですが。。) お分かりの方、お願い致します。

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

  • ベストアンサー
  • paz777
  • ベストアンサー率47% (77/163)
回答No.2

こんにちは。 こんなのではだめでしょうか? ------------------------------------------------- SELECT SUBSTR(Col2,1,6) || TO_CHAR(TO_NUMBER(SUBSTR(Col2,7))+1) FROM tblA WHERE Col1 = 1 AND Col2 = (SELECT MAX(Col2) FROM tblA WHERE Col1 = 1); ------------------------------------------------- ではでは・・・

funa1119
質問者

お礼

ありがとうございました。 SUBSTR, TO_NUMBER, 1つ勉強になりました。 無事値も取得でき、助かりました。 またお世話になることがあるかと思いますが、 今後ともよろしくお願いします。

その他の回答 (1)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

substr、to_numberを駆使して数値の部分を切り出してください。

関連するQ&A

  • OracleのSQLについて

    OracleのSQLについて質問があります。 VARCHAR2をReturnするFunction「GETKANANAME(引数はID)」があるとします。 このとき Update NAMELIST SET kananame = (select GETKANANAME('00001') from dual); とすると、kananameに何も設定されません。 (エラーメッセージなどは何も出ていません。) select GETKANANAME('00001') from dual; だと期待する値が帰ってくるのですが…。 何か間違ったSQL文なのでしょうか?

  • レコードが選択されないときの、置換ができません

    select max(COL_1) from TBL where COL2 = 'hoge'; というようなSQLがあり、この条件での選択されるレコードが存在しないとき max(COL_1)の値を"0"(ゼロ)にしたいのですが。。。 select nvl(max(COL_1),NULL,0) from TBL where COL2 = 'hoge'; と修正しても結果は変わらず「レコードが選択されませんでした。」 となってしまいます。 他にdecodeや、countも試したのですが、力量不足のため、上手くいきません。。 どなたかご教授願います。 Oracle 9i で SQL*Plus 使用しています。

  • Oracleのスペース文字について。

    今いろいろ調べていて、困っているのですが、ORACLEのスペースをVarchar2で取得した時、文字はどのように入っているのでしょう? たとえば、SELECT文を作って、スペースを取得した時、ASP+VBS等の変数を使ってスペース文字を変数に入れた時、どんな値が入ってくるのか知りたいのですが・・・・・ お分かりになる方いらっしゃいますか?

  • accessのデータをoracleへinsertする方法

    環境 vb6、access2000、oracle10g、OS:WinXP Pro accessの中にある30,000件のレコードをvb6でoracle10gに日常的にinsertしようと考えてます。(ボタンクリック時etc) insert into 『oracleのテーブル名』 select * from 『accessのテーブル名』 とは記述できないと思うのですが、30,000回 loop→insertさせると 15分くらい掛かります。何か処理速度を早くなる良い方法はありませんか?  お知恵をお貸し下さい。宜しくお願い致します。

  • oracleの「????」表記について

    お世話になります。 現在、oracle xeを使用し、DBの勉強をしております。 1点わからないところがありましたので、お手数ですがご教授をお願いします。 varchar2をデータ型とするカラムに対し、日本語でinsert文で挿入すると、 「????」で表現されてしまいます。 以下が入力したSQL文です ------------------------------------------------ insert into TABLELIST(ID,NAME) values(11,'テスト'); ------------------------------------------------ カラムIDのデータ型:char(2) カラムNAMEのデータ型:varchar2(9) これは文字コードの違いによるものなのでしょうか。 oracle xeでは文字コードがデフォルトで「utf-8」になっているのですが、 utf-8では日本語の入力は不可能ということでしょうか。

  • Oracleで「文字が無効です」のエラーが出ます

    Oracleで「文字が無効です」のエラーが出ます JavaからOracleに接続して、SELECT文を発行していますが、何度試しても上記のエラーが出ます。 発行しているSELECT文を、SQLPlusから打ち込むとちゃんと実行できます。 何が悪いのか見当がつきません。 お知恵をお貸しください。 ちなみに、対象テーブルの項目はvarchar2とnumberだけの項目ばかりで、日本語は使ってません。 また、Oracle初心者です。 環境 端末:WindowsXP Oracle:10g Express Edition ※文字コードはAL32UTF8 IDE:Eclipse3.5 ※設定-一般-ワークスペースのテキストファイルエンコードはUTF-8

  • Access→Oracleへ移行後MAX()が使えない

    Accessで運用していたDBをOracleへ移行したところ、AccessのクエリでMAX()関数など集計系の関数が使えなくなりました。 エラーのSQL例: SELECT MAX(MESSAGE) FROM LOGDATA; ※MESSAGEはVARCHAR(2000) エラーメッセージ: 集計関数の引数(MESSAGE)にメモ型またはOLEオブジェクト型のフィールドを指定することはできません エラーを回避するにはどうすればいいのでしょうか? Microsoft Access 2003 Oracle 10g R2

  • Oracle 10.2.0 でMAX集計がおかしい!?

    VB6 で oo4o を使って Oracle DB開発をしています。 Oralce 8.1.6 から Oracle10.2.0 にサーバを切り替えました。 bというテーブルがあって、 a c d ---- ------ ----- 10 2 1 20 3 1 30 4 1 40 5 1 50 6 2 というデータがあったとします。 Select MAX(a) as a from b WHERE d=1 のようなSQLをVBから発行したときに SQL*PLUSでは、 a ---- 40 という結果が返ってくるのですが、VBでは、 a --- 10 20 30 40 のように複数行のレコードセットが帰ってきます。そのため、最大行を取得できません。Oracle8 のときは、SQL*PLUSと同じ結果が返ってきていました。ちなみに Select MAX(a) as a from b WHERE d=1 GROUP BY d ~~~~~~~~~~ と、GROUP BYを付けると、ただしい(SQL_PLUSと同じ値)値が取得できます。 Oracle10.2.0の問題か、oo4oの問題かと考えています。 ちなみにoo4oのオブジェクトは、 CreateObject("OracleInProcServer.XOraSession") で作成していて、クライアントのバージョンは 9.2.0.4.4です。 長文で失礼しますが、どなたかSQLを変更せずに解決する方法をご存じないでしょうか?

  • 条件で取得列を分ける事は可能?

    COL1列の値次第でそれ以降の列を COL_A列を表示するかCOL_B列を表示するかを選択したいのですが SELECT文でCOL1の値がAならCOL_Aそれ以外ならCOL_Bの値を表示させる という事は可能でしょうか? 環境はOracle 9iを使用しております。

  • oracle 複数列を1列にまとめる

    oracle 複数列のデータ中身を別のテーブルの1列にインサートしたい ご存知の方、オラクルプロの方、 若輩者の私にアドバイス等ご指導受けたまりたく存じます。 以下のようなテーブルがあったとします。 テーブルA MID | K1 | K2 |K3 ------------------------- 011 |ああ |いい |うう  012 |ええ |おお |かか 特定の列を選択しての、Updateには成功しました。 update テーブルA set K1 = (select K1|| ' ' ||K2|| ' '||K3 from テーブルA where MID = '011') where MID = '011'; これを別のテーブルに全行Insertしたいのです。約5千行はあり、環境の制限によりSQL文のみしか使えません。 テーブルB MID |K1 ----------------------- 011 |ああ いい うう 012 |ええ おお かか 以下のようなSQLで正しいでしょうか? insert into テーブルA (K1) select K1|| ' ' ||K2|| ' '||K3 from テーブルB; 上記の方法で実施しましたが、下記のようなエラーメッセージが表示されます。MID項目が主キーのため、NULL不可なことはわかりますが、指定していないMIDが何故でてくるのでしょう? SQL Error: ORA-01400: テーブルA (MID) にはNULLは挿入できません。 環境情報: Oracle 10g  検証環境:Oracle SQL Developerあり 本番環境:Oracle SQL Developerなし、SQLのみ使用可