• ベストアンサー

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

こんにちは。 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

  • 引数によってwhere句を切り替える方法

    PL/SQLで開発しています。 一つのテーブルで検索条件(引数)によって検索するカラムを切り替えたいのですが、 カーソルをいくつも作らず、 一つのSELECT文で書く方法ってないのでしょうか? OR条件などを使って考えたのですが、うまくいきません。。 (例) SELECT * FROM 売り上げ情報 WHERE (品番 = 引数1 OR 商品名 = 引数2) 引数が無い時は"引数1"・"引数2"がNULLになるので、 カラムがPKなどになっていれば引数が片方しかなくてもうまく動作するのですが、 制限などがかかっていなくNULLで登録されているデータが存在すると余計なデータまでとれてしまいます。 DECODEなどでカラムに存在しない値に変換しようかとも思ったのですが、 なんか不自然な気が@@; いい方法があれば教えてください。

  • MySQLの文法について

    $sql = "SELECT * FROM profile WHERE (todouhuken='$todouhuken1' OR todouhuken='$todouhuken2' OR todouhuken='$todouhuken3') AND (age between $begin_age and $end_age) AND (photo1 is not null OR photo2 is not null OR photo3 is not null) AND seibetsu=2;"; 画像カラム(photo1, photo2, photo3)のどれかに画像ファイル名が入っていれば、 検索に引っかかるという、このSQL文ですが、データベース上で実際にこの3カラムすべてに 値が入っていないレコードまで引っかかってしまいます。この3カラムすべてに値が入っていないレコードは検索に引っかからないようにしたいのですが、どこが間違っているのか、 ご指導よろしくお願いします。

    • ベストアンサー
    • MySQL
  • あるカラムを対象に、Nullと空文字をゼロとして抽出したい

    SQL server 2005についての質問です。 ISNULL関数を使うと、Nullをゼロとして取り出せることがわかりました。 しかし、空文字をゼロとして取り出すことはできないようでした。 Nullと空文字が入り混じったカラムを対象に、Nullだけでなく空文字もゼロとして取り出す関数などはあるでしょうか? 以上、どうぞよろしくお願い致します。

  • smalldate型へnull値の代入

    MS SQL Server2003のsmalldatetime型のカラムへnull値を代入しようとすると、必ず、1999/01/01 の値が入っています。 明示的にnullを与えても同じ結果になります。 どうしたらnull値を代入できるのでしょうか。 もちろん、カラムはnull値を許す設定になっています。

  • 半角英数入力が認識されません

    ゆうちょ銀行口座の記号・口座番号を半角数字で何回入力し直しても、『口座番号を半角数字で正しく入力してください』とのメッセージが出てきてしまい、次のステップに進めません。 こういったケースは初めてで戸惑っております。 記号番号は、同じように入力してもエラーになりません。 私、自身も色々検索や、設定の見直しを行ったのですが、お手上げです。 どうか、ご助言宜しくお願い致します

  • ■一番最初に値が入っている(Nullでない)カラム名を取得するには?

    ■一番最初に値が入っている(Nullでない)カラム名を取得するには? 会社の上司が、上記の条件をSQL文一つで出来るというのですが、 postgres SQLの書き方が思いつかず、大変困っています。 状況を説明します。 主に以下のようなカラムを持つテーブルがあります。 ID, 年, 月, タイプ, price_1d, price_2d, price_3d, ..., price_31d price_?d には null or 数字が入ります。 上記のような状況で、 price_1d ~ price_31d の順で最初に値が入っているカラム名を取得し、 最初に値があるのは何年何月何日と判定したいというわけです。 おまけに、タイプには 0 or 1 が入り、 その値によっては、price_?dではなく、別カラム price2_?d を見ないといけないという条件付きです。 このような条件をSQL一つで抽出することははたして本当に可能なのでしょうか? 何かしら解決の糸口となるヒントだけでも構いませんので、 何か情報を頂けると大変ありがたいです。 また、そんなの出来ません、 という情報でもいただけると嬉しいです。 宜しくお願い致します。

  • ADOでNullフィールドの抽出

    VB6.0+ADO2.7で、mdbファイルを扱っています。 .filterプロパティを使ってabcフィールドの値がnullまたは空のテーブルを抽出したく recordset.filter="abc= null or abc=''" としました。この場合は問題ないのですが、更にdefフィールドの条件を追加し recordset.filter="(abc= null or abc='') AND def= 'xyz'" としたところ 「実行時エラー3001 引数が間違った型、許容範囲外、または競合しています。」 というエラーが発生してしまいます。 また、 recordset.filter="abc= null AND def= 'xyz'" 或いは recordset.filter="abc='' AND def= 'xyz'" では問題ありません。 何が悪いのでしょうか? よろしくお願いします。

  • カタカナの半角入力

    フェリーのチケットを取るために会員登録をしようと、名前など入力しましたが「フリガナは半角で入れてください」とエラーになってしまいます。もちろん半角で入力しているのですが何度やってもだめなので試しに半角英字の大文字で入力したところ、エラーが出ませんでした。パスワードも英字・数字の併用、半角で入れてください、とありますがエラーになるので、半角英字のみで試しに入力してみたところOKでした。 面倒なのでそのまま登録しようとも思いましたが、次にクレジットカードの登録があり、ややこしいことになりそうで心配です。私の文字入力の設定がおかしいのでしょうか?

  • INSERT文のSELECT部分の更新

    insert into selectについて教えてください。 あるテーブルからselectした値と、連続する値を 同時にinsertするする事はできますでしょうか? 使用DBはOracle9iです。 例えば、以下のようなテーブルがあった時に テーブルA カラム1 カラム2 カラム3 カラム4 この時に、カラム1,カラム2,カラム3を別のテーブルからselectし、 カラム4には「100001」から順に値を1ずつ増やしてながら セットしたい場合、1つのSQLで実行する事は可能でしょうか? ヒントなどいただけたらと思います。よろしくお願いします。

  • デフォルトで英字は半角入力したい

    かれこれ何年もWindowsを使っているものですが、最近くだらない事で 悩んでいます。(汗) 私は日ごろから英数字は半角で入力をしております。 ですから普段はテンキーで数字を入力して、その後連続で英字を入力しま すと半角の英字が入力されます。 しかし会社で誰かが私のPCを使用したときに全角の英文字を入力した らしく、それ以来英字を入力するたび全角が表示されてしまいます。 前までは(例えば)”0001AAA”と、数字の入力後は必ず半角英字だったの ですが、今では”0001AAA”と全角になってしまいます。 単にF10を押して、半角に変換すればよいのですが、今まで変換もせずに ただEnterを押していただけなので、すごくイラつきます。 Windowsを起動後に、エディターなどで一度F10で全角を半角に変換する と、それ以降の入力は、従来私が行ってきた入力方式に戻るのですが、 再びPCを立ち上げなおすと、やはり全角が表示されます。 IME2000のプロパティなどを見ていても、英字は全角/半角を切り替える 設定は見当たらないので、どう直せばよいやらです。。。 くだらない質問ですが、おわかりになる方いますでしょうか? よろしくお願いします。