【问题标题】:Is there a way get name of a file without its extension through SQL?有没有办法通过 SQL 获取没有扩展名的文件名?
【发布时间】:2019-05-20 21:25:41
【问题描述】:

我正在编写一个查询,该查询需要从其目录位置获取文件名,而不需要其文件路径和文件扩展名

示例:如果存在路径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 作为结果。

【问题讨论】:

    标签: sql database oracle select plsql


    【解决方案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)
    

    【讨论】:

    • 你还需要切断路径(使用类似的逻辑)。
    • @Salman,OP 说函数返回“example.xls”,所以我只删除了扩展名。如果还有其他内容要删除,当然 - 应该调整代码。
    【解决方案2】:

    您可以使用两次 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
    

    【讨论】:

      【解决方案3】:

      您只需调用一次 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.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-07
        • 2015-02-14
        • 1970-01-01
        • 2021-07-18
        • 1970-01-01
        • 2016-12-24
        相关资源
        最近更新 更多