トップページに戻る
次の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を返します。