有没有一种方法可以通过SQL获取没有扩展名的文件名?

时间:2018-12-20 10:55:28

标签: sql database oracle select plsql

我正在编写一个查询,要求从目录位置获取文件名称,而没有文件路径和文件扩展名

示例:如果存在路径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 :(得分: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.