我正在编写一个查询,该查询要求从文件的目录位置获取文件的名称,但不包括文件路径和文件扩展名
示例:如果路径存在于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.Is,有一种方法可以只获取example作为结果。
发布于 2018-12-20 19:03:00
您可以删除扩展名;搜索最后一个点(或者,如果从右向左查找,则搜索第一个点),并提取从第一个字符到点位置的所有内容。例如:
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)发布于 2018-12-20 19:55:37
您可以使用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发布于 2018-12-28 00:06:32
您只需要调用一次REGEXP_SUBSTR。此示例将整个路径解析为其各个部分。对于OP的答案,您只需要对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.https://stackoverflow.com/questions/53867281
复制相似问题