というのをやりました。instrchar_lengthsubstrを組み合わせることでできます。

まずinstrで特定の文字列の位置を取得します。次にchar_lengthで文字数を取得します。後はsubstrinstrで取得した文字以降の文字列を取得します。

具体例で書くと下記のような感じ。

1
2
3
4
select 
distinct substr(email, instr(email,'@'),char_length(email)) as domain
from user
order by domain

上記が何をしているかというと@以降の文字列を取得して重複行を除いて表示しています。テーブル名とカラム名から見て解る通り、データベースに登録されているメールアドレスのドメイン部を重複を除いて取得しています。(今回これがやりたかった)

上記のコードだと結果には@も含まれたものが取得されます。@を除いたものを取得したい場合は下記のようにsubstrの第2引数に+1を記述します。

1
2
3
4
select 
distinct substr(email, instr(email,'@') + 1 ,char_length(email)) as domain
from user
order by domain

instrは文字列内に同じ文字が複数含まれていた場合は最初の位置を返すので、複数入っていた場合に後ろからとりたい場合は…どうしたらいいんでしょうね…?reverseとか組み合わせたらできると思いますが、やってないし、今回はその必要性もなかったので試してません。