基本上,问题是我有一个像这样的SELECT语句:
SELECT sys_connect_by_path(name,'/')
这给了我这样的输出:
/我想要的文件夹名称/另一个文件夹..... /我正在寻找文件夹
我想把所有东西都剪掉,只留下第一个文件夹的名字。这样做最好的方法是什么?
答案 0 :(得分:0)
尝试:
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只返回第一对括号内的字符串部分。
答案 1 :(得分:0)
如果您的文件表包含类似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