我正在编写一个查询,要求从目录位置获取文件名称,而没有文件路径和文件扩展名
示例:如果存在路径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
作为结果。
答案 0 :(得分:4)
您将删除扩展名;搜索最后一个点(如果从右向左看,则搜索第一个点),然后提取从第一个字符到点位置的所有内容。例如:
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)
答案 1 :(得分:3)
您可以两次使用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
答案 2 :(得分:2)
您只需要打一次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.