• ベストアンサー

SQL-文字列操作について

はじめまして。 SQLにて、”指定の文字「-」を検索し、先頭から「-」のひとつ前までを取得”を実現したいのですが、 これは実現できますでしょうか。(substrやinstrなどでは無理そうなので、お知恵お借りしたいです。) 例) 01234567-001 0123456-001 012345-001 0123456789-001 上記に対して、期待する実行結果は次の通りです。 01234567 0123456 012345 0123456789 こんなことは可能でしょうか。

  • Oracle
  • 回答数2
  • ありがとう数14

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

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

decodeだったりnullifとnvlの組み合わせだったり方法はいくらでもあると思いますが、case式を使う例だと select  case   when instr(col, '-') > 0 then substr(col, 1, instr(col, '-') - 1)   else col  end as col from tbl; こんな感じとかでしょうか。

london1985
質問者

お礼

お返事が遅くなりまして、大変申し訳ございません。 また、もうひとつの質問のほうにも記載させていただきましたが、重複する質問を別個にあげてしまい、申し訳ございませんでした。 yamada_gさんにお答え頂いた内容で、確実に解決致しました、 非常に助かりました。ありがとうございます。

その他の回答 (1)

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

substrとinstrでできると思いますが。 select substr(col, 1, instr(col, '-') - 1) from tbl; でいいのではないでしょうか。 '-'が含まれていない場合はnullが返りますので、そのあたりの制御が必要であれば適宜修正してください。 10g以降であれば、正規表現を使って select regexp_replace(col, '-.+', '') -- '-'以降のすべての文字を置き換える from tbl; こんなのでもいいかもしれません。

london1985
質問者

補足

ご回答ありがとうございます! >-'が含まれていない場合はnullが返りますので、 >そのあたりの制御が必要であれば適宜修正してください。 ちなみに、colがNULL('-'が含まれない)場合に、colのそのままの値を出力という形にすることは可能でしょうか。

関連するQ&A

  • SQL 文字列検索につきまして

    はじめまして。 この質問に関連する内容につきまして、ご回答を頂けたのですが 以下の事項につきまして、追加で質問させて頂きたく存じます。 【過去の質問】 >SQLにて、”指定の文字「-」を検索し、先頭から「-」のひとつ前までを取得”を実現したいのですが、 >これは実現できますでしょうか。(substrやinstrなどでは無理そうなので、お知恵お借りしたいです。) > >例) >01234567-001 >0123456-001 >012345-001 >0123456789-001 > >上記に対して、期待する実行結果は次の通りです。 >01234567 >0123456 >012345 >0123456789 【ご回答】 >select substr(col, 1, instr(col, '-') - 1) >from tbl; >でいいのではないでしょうか。 >'-'が含まれていない場合はnullが返りますので、そのあたりの制御が必要であれば適宜修正してください。 ★追加質問内容 上記のcolがNULL('-'が含まれない)場合に、colのそのままの値を出力という形にすることは可能でしょうか。 例) 01234567-001 0123456-001 012345-001 0123456789-001 0123456  ← 111345   ← 上記に対して、期待する実行結果は次の通りです。 01234567 0123456 012345 0123456789 0123456  ← 111345   ← お手数ですが、ご教示のほど宜しくお願い致します。

  • PL/SQLでの文字列比較

    PL/SQL内の条件文で以下のような文字列比較は出来ないでしょうか? (1)ある変数に指定文字列が含まれるかどうか (PASCALで言うところのPOS関数のような) (2)ある変数が指定文字列で始まる・終わるかどうか (JAVAで言うところのstartWith,endWithのような) 調べたところ、(1)に関しては[instr]関数が使えそうだったのですが、文法エラーとなってしまいました。 どなたかお分かりになる方、よろしくお願いします。

  • SQLで条件の文字列を含んでいるデータを取得する方法

    SQLにて指定した文字列を含むデータを取得する方法を探しています。 例 テーブル Test 番号   条件 __________ 01    AA 02    BB 03    AA,CC 上記のように、番号と条件という2つのフィールドを持っているテーブルをTestとします。 (1)条件にAAと指定すると、番号01と03が取得。 (2)条件にBBと指定すると、番号02が取得。 (3)条件にAAAと指定すると、一致条件なし。 (1)~(3)のような条件を満たすSQLの構文はありませんでしょうか? ご教授お願いいたします。

  • 文字列をsplitするSQL文を教えて下さい

    SQLServer2000上で指定した文字で文字列をsplitような関数があれば教えて頂けますか? 例えば"12345.6789"という文字列を"."(ピリオド)を指定して、"12345"と"6789"という2つの文字列を取得したいと思っています。 Transact-SQLの関数リファレンスを見てみたのですが、適当なものが見つかりませんでした。 自作するしかないのでしょうか・・

  • SQL、oracleにて文字列操作(連結、切りだし)のパフォーマンス向上法

    oracle7を使用しています。 #desc a num  char(8) code char(2) seq char(2) ・・・ #desc b bango char(12) ・・・ 上記場合で aのnum,code,seq を結合したものと bのbangoが 同じかどうかの検索を外部結合付きで行いたいとします。 where bango(+) = num || code || seq で動作は正常に行われるのですが、検索速度がかなり重くなってしまいます。 文字列連結(||)は重くなるというのを聞いたことがあるのでできれば (||)を使用したくないのです。 where substr(bango,0,8) (+) = num and substr(bango,9,2) (+) = code and substr(bango,11,2) (+) = seq とすると外部結合のところでおこられちゃいました。 文字列連結をつかわずに上記SQLの検索パフォーマンス向上法を どなたか教えていただけませんか?

  • C言語での文字列より値を抜き出す

    C言語初心者です。 たとえば、”ABCDE”という文字列があります。 その文字列の2桁目から3文字を取得したい場合、 どのようにすればよろしいでしょうか。  上記の場合、”BCD”が欲しい SQLだと、SUBSTR(B)関数がありますが、C言語には 同様な関数があるのでしょうか。 また、C++ではどうでしょうか。 お客さんに突然聞かれたので、本屋に行く余裕もありませんでした。 どなかた教えてください。お願いします。

  • ポインタを用いた文字列操作について…。

    C初心者です。 「ある文字列を読み込んだ後、その文字列中にある文字(複数)を指定する。指定した文字を最初の文字列から消す」という関数を作りたいのですが、うまくいきません。 例を挙げると、 文字列 :OshieteGoo 指定文字:to 文字列改:OshitG のような感じにしたいです。 #define NULLC '\0' void strCpy(char *ptr1, char *ptr2, char *cMain) { char *cSub = cMain; /* ポインタバックアップ */ for(;*ptr1!=NULLC;ptr1++){ for(cSub=cMain;*cSub!=NULLC;*cSub++){ if(*ptr1!=*cSub){ *ptr2 = *ptr1; ptr2++; } break; } } *ptr2 = NULLC; return; } 自分なりにこう考えてみたのですが、これを実行すると 文字列 :OshieteGoo 指定文字:to 文字列改:OshitGoo となり、指定文字の2文字目以降がうまく削除できません…。 この問題を解決できるお知恵を拝借させて頂けると幸いです^^;

  • SQL文の書き方

    SQLを勉強しています。 レコードの中で指定フィールドの文字列が、指定文字から始まるレコードを取り出したいのですがSQL文の書き方がわかりません。 例) 1, AAA 2, BBB 3, CCC 4, ABC 上記の4つのレコードから"A"から始まるレコードを取り出したい。 結果は[1, AAA]と[4, ABC]が欲しいのです。

  • 文字列の操作

    こんにちは。 以下のような、文字列があるとします。 NUMBER1(ヌル\0)からNUMBER1000(ヌル\0)までの文字列があるとします。 NUMBERは付属で、ほしい文字列が1から1000までNUMBERの次にある場合、1から1000までを取得する方法として、 Buf[100] int x=0; while(Buf[x]!='\0') //ナル文字までの長さを取得 x++; memmove(&Buf[0],Buf[x-1],4); //NUMBER1の場合、長さは7。しかしほしい文字列は第6要素なのでx-1。 しかし・・・これを行うと、 NUMBER10:長さ8 NUMBER100:長さ9 ・ ・ となり、二桁以上の場合は、memmove(&Buf[0],Buf[x-2],4)と、 第2引数を手動で可変しなければなりません。 そこで、NUMBER\01\0 NUMBER\01000\0というように、 NUMBERの次にヌル文字(あってますでしょうか?)\0を挿入し、次の要素に1から1000まで文字列を挿入。そして文字列終端が分かるように再度\0を挿入します。 しかしこのような場合、ヌルを2つ挿入することで、上記に示したプログラムでは、手前の\0までしか長さを取得しないので、うまくいきません。 そこで、文字列の区切りを示すための方法として、なにかありますでしょうか? 文字列は最後に、\0を挿入することで判別すると書いてありますが、 NUMBERVISUALC++\0というような文字列を配列に格納してある場合、 NUMBERとVISUALC++をどのように分けて取得するのでしょうか? それとも、第6要素から取得した文字列があると言う事が分かっている場合、第6要素からを指定するプログラムを作るということになるのでしょうか? よろしくお願いします。

  • SQLで後方の文字列を置換する方法

    表現方法が稚拙で申しわけありませんが。 あるテーブルに存在する値を、他のテーブルにある値と前方一致で結合したいと思います。 (1)TBL_A(項目名はA) (a) 10230 (b) 11350 (c) 30040 (2)TBL_B(項目名はB) (d) 10200 (e) 11000 (f) 30000 (形式はVARCHAR2,値は数字のみで長さは固定) 上記のようなデータで、TBL_Bに関しては後ろの「0」は無視して 前方一致で結合したいのです。 つまり、(a)と(d)、(b)と(e)、(c)と(f)が結合されるようにしたいのです。 SQL文で表現すると、次のようになります。 TBL_A.A LIKE '102%' OR TBL_A.A LIKE '11%' OR TBL_A.A LIKE '3%' これを次のようなSQLで記述してみました。 TBL_A.A LIKE SUBSTR(TBL_B.B,1,INSTR(TRANSLATE(TBL_B.B,'123456789','XXXXXXXX'),'X',-1,1)) || '%' 以上のSQLで問題ないと思いますが、もっとシンプルな方法があればお教え願います。 DBはORACLE9iです。