トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-276 パスの最下位のディレクトリ名を取得

SQLパズル

pathList
path
--------------------------------------
\\mymachine\A\B\C\D\music.mpg
\\mymachine\A\B\C\image.jpg
\\mymachine\A\B\fileB.txt
\\mymachine\A\fileB.txt
c:\aaa.txt
c:\myfolder\folderD\folderE\4969-A.txt
c:\temp\fileA.txt
c:\temp\folderA\fileA.txt

パスの最下位のディレクトリ名を取得する。

出力結果
path                                    dire
--------------------------------------  -------
\\mymachine\A\B\C\D\music.mpg           D
\\mymachine\A\B\C\image.jpg             C
\\mymachine\A\B\fileB.txt               B
\\mymachine\A\fileB.txt                 A
c:\aaa.txt                              c:
c:\myfolder\folderD\folderE\4969-A.txt  folderE
c:\temp\fileA.txt                       temp
c:\temp\folderA\fileA.txt               folderA

こちらを参考にさせていただきました(英語)


データ作成スクリプト

create table pathList(path) as
select '\\mymachine\A\B\C\D\music.mpg'          from dual union all
select '\\mymachine\A\B\C\image.jpg'            from dual union all
select '\\mymachine\A\B\fileB.txt'              from dual union all
select '\\mymachine\A\fileB.txt'                from dual union all
select 'c:\aaa.txt'                             from dual union all
select 'c:\myfolder\folderD\folderE\4969-A.txt' from dual union all
select 'c:\temp\fileA.txt'                      from dual union all
select 'c:\temp\folderA\fileA.txt'              from dual;


SQL

col dire for a10

--■■■regexp_countを使う方法(11g以降)
select path,RegExp_substr(path,'[^\]+',1,-1+regexp_count(path,'[^\]+')) as dire
  from pathList
order by path;

--■■■RegExp_replaceを使う方法(10g以降)■■■
select path,RegExp_replace(path,'^.*?([^\]+)\\[^\]+$','\1') as dire
  from pathList
order by path;

--■■■instr関数を使う方法■■■
select path,
substr(path,StaPos,endPos-StaPos+1) as dire
from (select path,
      instr(path,'\',-1,2)+1 as StaPos,
      instr(path,'\',-1  )-1 as endPos
      from pathList)
order by path;


解説

instr(path,'\',-1)は、文字列の最後から、1個目の'\'を探します。
instr(path,'\',-1,2)は、文字列の最後から、2個目の'\'を探します。

見つかればその位置を、見つからなければ0を返します。