- ベストアンサー
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です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
TBL_A.A LIKE RTRIM(TBL_B.B, '0') || '%' でいけるのではないでしょうか? RTRIMの第二の引数は省略可能で省略時は単一の空白だそうです。 この質問で少し調べてみましたが、RTRIMにこんな使い方ができるとは、私も初めて知りました。
その他の回答 (3)
もし前方一致させる文字数が固定なら、AとBをsubstrで切った値を使えば、普通に出来ると思います。 where substr(a.a, 1, 3) = substr(b.b, 1, 3) 上の例ではa.aの1文字目から3文字分と、b.bの一文字目から3文字分のみで=の判定をしています。 これで質問の中に書いてある内容のことは出来ると思います。
補足
ありがとうございます。 残念ながら、前方一致させる文字数は、可変です。 TBL_BのBの後ろの「0」の数が可変なのです。
- na_kirajp
- ベストアンサー率43% (33/76)
#1ですが、 一致しなかった場合ってどう想定されていますか? #1では、Aが10000でBに09999の場合は結合してしまいます。
補足
一致しなかった場合は、該当データなし(カーソルFORループから抜ける)として、別の処理を行ないます。 申し遅れましたが、PL/SQLでアプリケーションを組もうとしています。
- na_kirajp
- ベストアンサー率43% (33/76)
数字で、前方一致との事なので、 TBL_Aの値とTBL_Bの値の関係は>=の関係になるので SELECT A,MAX(B) FROM TBL_A,TBL_B WHERE TBL_A.A >= TBL_B.B GROUP BY A ; では如何ですか?
補足
早速のご回答恐れ入ります。 申しわけありません。質問の仕方が間違っていました。 TBL_Bの項目はBだけではなく、他の項目も必要なのです。 つまり、TBL_Bを検索するときの値として、TBL_AのAを使用したいのです。 実際には「TBL_A.A」は別のSELECT文で変数に代入します。
お礼
ありがとうございます。 これなら、大変すっきりしています。 お陰さまで問題が解決いたしました。