Есть ли способ получить имя файла без его расширения через SQL? - PullRequest
0 голосов
/ 20 декабря 2018

Я пишу запрос, который требует имя файла из его каталога без его пути к файлу и расширения файла

Пример: если путь существует c:\temp\example.xls Мне нужен результат запроса как простопример.

Я ссылался на сайт https://www.techonthenet.com/oracle/questions/filename.php, он показывает способ получения имени файла с расширением.Мне было интересно, есть ли другой способ просто получить имя файла.

Это код, который я использовал:

CREATE or REPLACE function get_filename
   (p_path IN VARCHAR2)
   RETURN varchar2

IS
   v_file VARCHAR2(100);

BEGIN

   -- Parse string for UNIX system
   IF INSTR(p_path,'/') > 0 THEN
      v_file := SUBSTR(p_path,(INSTR(p_path,'/',-1,1)+1),length(p_path));

   -- Parse string for Windows system
   ELSIF INSTR(p_path,'\') > 0 THEN
      v_file := SUBSTR(p_path,(INSTR(p_path,'\',-1,1)+1),length(p_path));

   -- If no slashes were found, return the original string
   ELSE
      v_file := p_path;

   END IF;

   RETURN v_file;

END;

Создает функцию для получения имени файла из местоположения с его расширением.

SELECT get_filename('c:\temp\example.xls')
FROM dual;

Этот оператор SQLвернул бы example.xls .Есть ли способ просто получить example как результат.

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Вы можете использовать REGEXP_SUBSTR, дважды:

WITH tests(filepath) AS (
    SELECT 'c:\path\to\example.xls' FROM DUAL
    UNION ALL
    SELECT 'c:\path\to\example' FROM DUAL
    UNION ALL
    SELECT 'example.xls' FROM DUAL
    UNION ALL
    SELECT 'example' FROM DUAL
)
SELECT filepath, REGEXP_SUBSTR(REGEXP_SUBSTR(filepath, '[^\]+$'), '[^\.]+')
FROM tests
0 голосов
/ 27 декабря 2018

Вам нужен только один вызов REGEXP_SUBSTR.Этот пример разбирает весь путь на его части.Для ответа ОП вам нужен только второй вызов REGEXP_SUBSTR.

РЕДАКТИРОВАТЬ: обновлено, теперь обрабатывает имена файлов с несколькими точками в них и имена файлов, начинающиеся с точки.

WITH tbl(ID, fullpath) AS (
    SELECT 1, 'c:\path\to\example.xls' FROM DUAL UNION ALL
    SELECT 2, 'c:\path\to\example.1.2.xls' FROM DUAL UNION ALL    
    SELECT 3, 'c:\path\to\example' FROM DUAL UNION ALL
    SELECT 4, 'example.xls' FROM DUAL UNION ALL
    SELECT 5, 'example.1.2.xls' FROM DUAL UNION ALL    
    SELECT 6, 'example' FROM DUAL UNION ALL
    SELECT 7, NULL FROM DUAL
)
SELECT ID, fullpath, 
  REGEXP_SUBSTR(fullpath, '^(.*\\)?(.+?)(\.[^.]*$|$)', 1, 1, null, 1) path,
  REGEXP_SUBSTR(fullpath, '^(.*\\)?(.+?)(\.[^.]*$|$)', 1, 1, NULL, 2) filename,
  REGEXP_SUBSTR(fullpath, '^(.*\\)?(.+?)(\.[^.]*$|$)', 1, 1, null, 3) extension
FROM tbl
order by ID;


 ID FULLPATH                   PATH         FILENAME     EXTEN
--- -------------------------- ------------ ------------ -----
  1 c:\path\to\example.xls     c:\path\to\  example      .xls 
  2 c:\path\to\example.1.2.xls c:\path\to\  example.1.2  .xls 
  3 c:\path\to\example         c:\path\to\  example           
  4 example.xls                             example      .xls 
  5 example.1.2.xls                         example.1.2  .xls 
  6 example                                 example           
  7                                                           

7 rows selected.
0 голосов
/ 20 декабря 2018

Вы удалили расширение;найдите последнюю точку (или первую, если вы смотрите справа налево) и извлеките все, начиная с 1-го символа до положения точки.Например:

SQL> WITH test (v_file) AS
  2    (SELECT 'my example.xls' FROM DUAL)
  3  SELECT SUBSTR (v_file, 1, INSTR (v_file, '.', -1) - 1) result
  4    FROM test;

RESULT
----------
my example

SQL>

В вашем случае это будет

return SUBSTR (v_file, 1, INSTR (v_file, '.', -1) - 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...