2013-10-03 70 views
0

基本上,問題是我有一個SELECT語句,像這樣:如何修改SELECT語句輸出甲骨文

SELECT SYS_CONNECT_BY_PATH(名稱, '/')

這給了我輸出像這樣的:

/文件夾的名稱我想/其他文件夾..... /文件夾,我從

我想把所有東西都剪掉,只需要第一個文件夾的名字。這樣做最好的方法是什麼?

回答

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 
) 
; 

「-1」 INSTR的參數告訴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 
) 
; 

在這裏,我們toook優勢的子表達式的 - 的* REGEXP_SUBSTR *告訴Oracle返回是第一對括號中的字符串只把部分的最後一個參數。

+0

實際上,我希望得到第一次出現從頭開始。反過來也是如此。我想得到'/我想要的文件夾名稱',然後離開休息。 – Chris

+0

對不起,錯了......又增加了一個解決方案。 –

+0

用正則表達式去。工作很好,謝謝! – Chris

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