基本的に、問題は次のような SELECT ステートメントがあることです。
SELECT sys_connect_by_path(name, '/')
次のような出力が得られます。
/必要なフォルダの名前/別のフォルダ...../探しているフォルダ
そして、すべてを切り取って、最初のフォルダーの名前だけにしたいと思います。これを行うための最良の方法は何ですか?
UNIX に似たファイル パス (ディレクトリ、場合によってはファイル) のリストを含むファイル テーブルがある場合は、次のようなクエリを使用して、ファイル マネージャーの表示として結果を取得できます。
SELECT f.file_path,
SUBSTR(f.file_path, 1, INSTR(f.file_path, '/', -2)) AS parent_file_path
FROM files_tbl f
START WITH (f.file_path = '/') -- Start with the root directory path
CONNECT BY PRIOR f.file_path = SUBSTR(f.file_path, 1, INSTR(f.file_path, '/', -2))
ORDER SIBLINGS BY parent_file_path ASC NULLS FIRST, f.file_path ASC;
このクエリは、ディレクトリが file_path の / で終了/終了していることを前提としていますが、ファイルはそうではありません。
/
/folder/
/folder/file.log
/folder/subfolder/
/folder/subfolder/example.txt
試す:
SELECT substr(str, instr(str, '/', -1) + 1)
FROM (
SELECT '/Name of Folder I want/Another folder...../Folder Im looking from' AS str FROM dual
)
;
instrの「-1」パラメータは、最後から始まる「/」文字の最初のオカレンスを返すように Oracle に指示します。
編集:すみません、間違って読みました、別の提案(醜いもの):
SELECT substr(str, 2, CASE
WHEN instr(str, '/', 2, 1) > 0 THEN instr(str, '/', 2, 1) - 2
ELSE length(str) - 1
END)
FROM (
SELECT '/Name of Folder I want/Another folder...../Folder Im looking from' AS str FROM dual
UNION ALL
SELECT '/Name of Folder I want' AS str FROM dual
)
;
正規表現は別の可能な解決策を提供しますが、作業中の文字列の最後に「/」文字を連結する必要があります。
SELECT regexp_substr(str || '/', '/(.*?)/', 1, 1, NULL, 1)
FROM (
SELECT '/Name of Folder I want/Another folder...../Folder Im looking from' AS str FROM dual
UNION ALL
SELECT '/Name of Folder I want' AS str FROM dual
)
;
ここでも部分式を利用しています。*regexp_substr* の最後のパラメーターは、最初の括弧のペア内にある文字列の一部のみを返すように Oracle に指示します。