• ベストアンサー

SQL 全角半角混在の文字列から半角数字のみを抜き出す

以下のようなことを「SQL文のみ」で行いたいのですが、 どなたかご教授のほどお願い致します。 下記のような変換前の文字列があるとします。 それを変換後のような形式にしたいのですが可能でしょうか? ■変換前 →2721111千葉県浦安市3-3-3浦安マンション222 ■変換後 →2721111333222 要するに数字だけを抜き出したいのですが できますでしょうか。 REGEXPのような正規表現は使用できないようです、 oracle9iです。 恐れ入りますが、よろしくお願いします。

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

  • ベストアンサー
回答No.2

数値のみピックアップするのは無理矢理出来ます。 select replace(translate(:対象文字列,replace(translate(:対象文字列,'0123456789','0'),''),'x'),'x','') from dual; *「:対象文字」の部分を格納している項目や変数に読み替えてください。

yukio200263
質問者

お礼

ありがとうございます。 できました。 translateをうまく活用すればこんなことができるんですね。

すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.5

こんにちは。 >>どのような環境でも保証できる判断であるべきです。 おっしゃる通りです・・・、失礼しました・・・。 っていうか、この場合は文字コードで判断しなければいけないような場面でもなさそうですね・・・。 単純に0~9の範囲でいいのかも・・・? (未確認ですが) (^^ゞ

すると、全ての回答が全文表示されます。
  • fu_u_ka_i
  • ベストアンサー率51% (15/29)
回答No.4

>#3 >IF ASCII(SUBSTR(MOTONETA,I,1)) BETWEEN 48 AND 57 ASCII関数は、データベースキャラクタでのコード値を参照するための関数です。 コード値で範囲判定するなら、予めキャラクタセットが限定されなければなりません。 コード値で判断するなら、 IF ASCII(CONVERT(SUBSTR(MOTONETA,I,1),'JA16SJIS') BETWEEN 48 AND 57 のように、どのような環境でも保証できる判断であるべきです。 (予め環境が判っているなら別ですけど..今回は不明でしょ?)

yukio200263
質問者

お礼

ご親切にどうもありがとうございます。 実際にはPL/SQLは使わないかもしれませんが、使う場合は参考にさせていただきます。

すると、全ての回答が全文表示されます。
回答No.3

こんばんは。 数値も全角の可能性がありますか? 半角数値のみ抜き出す場合・・・、 DECLARE MOTONETA VARCHAR2(100) := '2721111千葉県浦安市3-3-3浦安マンション222'; KEKKA VARCHAR2(100); TEMP VARCHAR2(100); BEGIN FOR I IN 1 .. LENGTH(MOTONETA) LOOP IF ASCII(SUBSTR(MOTONETA, I, 1)) BETWEEN 48 AND 57 THEN TEMP := KEKKA || SUBSTR(MOTONETA, I, 1); KEKKA := TEMP; TEMP := NULL; END IF; END LOOP; DBMS_OUTPUT.PUT_LINE(KEKKA); END; でできます。 全角数値も数値とみなす場合は、コードを追加しないとだめですが・・・。 (^^ゞ

yukio200263
質問者

お礼

ありがとうございます。 PL/SQLは、あまり分からないのでなんとなくしか理解できないのですが、試してみたいと思います。

すると、全ての回答が全文表示されます。
回答No.1

こんばんは。 難しいですね・・・。 10gに移行できませんか? 正規表現が使えます。 >>SQL文のみ 9iでは・・・無理ですね。 せめてPL/SQL使うなら、何とかなりそうですが・・・。 (^^ゞ

yukio200263
質問者

お礼

やはり難しいですか。 ちなみにPL/SQLを使っても良いようなのですが、 もしお分かりになりましたらご教授いただけますか?

すると、全ての回答が全文表示されます。

関連するQ&A