2013-10-03 1 views
0

В принципе, проблема у меня есть ЗЕЬЕСТ следующим образом:Как изменить ВЫБЕРИТЕ оператор вывода в Oracle

ВЫБОР SYS_CONNECT_BY_PATH (имя, «/»)

Который дает мне выход, как это:

/Имя папки Я хочу/Другая папка ...../папка Я ищу с

И я хотел бы вырезать все и просто иметь имя первой папки. Каким будет лучший способ сделать это?

ответ

0

Try:

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" параметр инстр говорит 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

Я на самом деле хотите получить первое вхождение, начиная с самого начала. Так что просто наоборот. Я хочу получить '/ Name of Folder I want', а затем оставить все остальное. – 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 
Смежные вопросы