• ベストアンサー

半角英数文字の抽出がしたい。

こんにちは。 SQLで分からない事があります。 大変申し訳ございませんが、ご存知の方おられましたら アドバイスをよろしくお願い致します。 SQLで無理な場合はPL/SQLでも構いません。 (質問内容) SELECT文で、カラムに入っている値を半角英字or数字だけ取り出して SELECTをしたいのですが、どのようにすればよいのでしょうか? 例)カラムに値にABC-!123が設定されている場合、   ABC123がSELECTできるようにしたい。  ※カラムには何が設定されているかわかりません。   (NULLという事は、ありません。) 以上です。 よろしくお願い致します。

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

  • ベストアンサー
  • sippo06
  • ベストアンサー率25% (7/27)
回答No.3

PL/SQLでつくってみました。 1文字づつチェックしているので、ちょっとスマートではないかも知れませんが・・・・ create or replace function GET_ALPHA_NUM(STR IN VARCHAR2) return varchar2 is Result VARCHAR2(300); --結果 STR_TMP VARCHAR2(300); --チェック用の文字列(大文字にして格納) CHK_CHAR VARCHAR(2); --バッファ CHK_CHAR_CODE NUMBER; iLoop NUMBER; begin STR_TMP := NLS_UPPER(STR); --大文字にして格納(全角もとりたい場合はさらにTO_SINGLE_BYTE関数をかける) --1文字ずつチェックする For iLoop in 1 .. LENGTH(STR) LOOP CHK_CHAR := SUBSTR(STR_TMP, ILOOP, 1); --チェック文字 CHK_CHAR_CODE := ASCII(CHK_CHAR); --文字のコード IF CHK_CHAR_CODE >= ASCII('A') AND CHK_CHAR_CODE <= ASCII('Z') THEN --文字がA~Z Result := Result || SUBSTR(STR, ILOOP, 1); ELSIF CHK_CHAR_CODE >= ASCII('0') AND CHK_CHAR_CODE <= ASCII('9') THEN --文字が1~9 Result := Result || SUBSTR(STR, ILOOP, 1); END IF; END LOOP; return(Result); end;

その他の回答 (2)

回答No.2

間違えた。 select replace(translate(カラム,replace(translate(カラム,'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789','0'),'0',''),'-'),'-','') from TABLE;

回答No.1

強引な変換式です。(SQL文中の「カラム」が変換対象です) select replace(translate(カラム,replace(translate(カラム,'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789','0'),'0',''),'0'),'0','') from TABLE;

関連するQ&A