TRANSLATE関数

  • 今日も教えてgooを眺めているとデータベースカテゴリで目にとまった「TRANSLATE関数」。

これはなんでしょうか。さっそくググルってみます。

TRANSLATE( 検査文字列 , マッチ文字列 , 置換文字列 )
  • 説明を読んでもなんか複雑。自分にわかるように書いてみると
    1. 検査文字列から1文字取り出し。
    2. マッチ文字列の中に含まれるか?
      1. YES:置換文字列からマッチ位置に対応する桁位置の文字を取り出し、置換する。
      2. NO:検査文字列から取り出した文字そのまま。
    3. 検査文字列から次の文字を取り出し繰り返し。

実行

SELECT TRANSLATE( 'あいうえお' , 'あうお' , 'アウ' ) FROM DUAL

結果

アいウえ
  • 置換文字列がマッチ文字列より短く、マッチ文字列にマッチしても、対応する置換文字列がない場合は(空文字)になるようです。
  • では、置換文字列が空文字ならマッチ文字列に含まれる文字を一発で消去できるのでしょうか?

実行

SELECT TRANSLATE( 'あいうえお' , 'あうお' ,  ) FROM DUAL

結果

NULL
  • ダメです。こういう場合は、検査文字列に出てこない文字をダミー的に使うか、消去する文字のいずれかに一度揃えてからREPLACEするのが一般的のようです。

実行

SELECT REPLACE( TRANSLATE( 'あいうえお' , 'あうお' , '0'  ) , '0' ,  )  FROM DUAL
SELECT REPLACE( TRANSLATE( 'あいうえお' , 'あうお' , 'あ' ) , 'あ' , )  FROM DUAL

結果

いえ
  • さらに、これを二重にして、指定文字を消去するではなく、指定文字のみを残すには以下のようにします。

実行

SELECT REPLACE( TRANSLATE( 'あいうえお'
            , REPLACE( TRANSLATE( 'あいうえお' , 'あうお' , '0'  ) , '0' ,  )  
            , '0')
       , '0',  )
FROM DUAL

結果

あうお
  • まあ何かに使えるかもしれませんが…すぐには思いつきません。
  • 人の作ったソースを解析中にこんなSQLを発見したらグッタリしそう。

facebook slideshare rubygems github qiita