こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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です。

投稿日時 - 2004-10-19 17:08:05

QNo.1048572

困ってます

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

TBL_A.A LIKE RTRIM(TBL_B.B, '0') || '%'
でいけるのではないでしょうか?
RTRIMの第二の引数は省略可能で省略時は単一の空白だそうです。

この質問で少し調べてみましたが、RTRIMにこんな使い方ができるとは、私も初めて知りました。

投稿日時 - 2004-10-19 19:05:22

お礼

ありがとうございます。

これなら、大変すっきりしています。

お陰さまで問題が解決いたしました。

投稿日時 - 2004-10-21 08:37:45

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

もし前方一致させる文字数が固定なら、AとBをsubstrで切った値を使えば、普通に出来ると思います。

where substr(a.a, 1, 3) = substr(b.b, 1, 3)

上の例ではa.aの1文字目から3文字分と、b.bの一文字目から3文字分のみで=の判定をしています。
これで質問の中に書いてある内容のことは出来ると思います。

投稿日時 - 2004-10-19 18:07:42

補足

ありがとうございます。

残念ながら、前方一致させる文字数は、可変です。
TBL_BのBの後ろの「0」の数が可変なのです。

投稿日時 - 2004-10-19 18:33:39

ANo.2

#1ですが、
一致しなかった場合ってどう想定されていますか?
#1では、Aが10000でBに09999の場合は結合してしまいます。

投稿日時 - 2004-10-19 17:23:19

補足

一致しなかった場合は、該当データなし(カーソルFORループから抜ける)として、別の処理を行ないます。

申し遅れましたが、PL/SQLでアプリケーションを組もうとしています。

投稿日時 - 2004-10-19 18:41:42

ANo.1

数字で、前方一致との事なので、
TBL_Aの値とTBL_Bの値の関係は>=の関係になるので


SELECT A,MAX(B) FROM TBL_A,TBL_B
WHERE TBL_A.A >= TBL_B.B
GROUP BY A ;

では如何ですか?

投稿日時 - 2004-10-19 17:20:27

補足

早速のご回答恐れ入ります。

申しわけありません。質問の仕方が間違っていました。

TBL_Bの項目はBだけではなく、他の項目も必要なのです。
つまり、TBL_Bを検索するときの値として、TBL_AのAを使用したいのです。
実際には「TBL_A.A」は別のSELECT文で変数に代入します。

投稿日時 - 2004-10-19 18:31:29

あなたにオススメの質問