如何在Oracle中修改SELECT语句输出

时间:2013-10-03 20:28:20

标签: sql oracle select

基本上,问题是我有一个像这样的SELECT语句:

  

SELECT sys_connect_by_path(name,'/')

这给了我这样的输出:

  

/我想要的文件夹名称/另一个文件夹..... /我正在寻找文件夹

我想把所有东西都剪掉,只留下第一个文件夹的名字。这样做最好的方法是什么?

2 个答案:

答案 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