Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在Oracle中去掉文件扩展名(.docx、.pdf等),同时将分隔数据从单个列中分离出来_Sql_Oracle - Fatal编程技术网

Sql 如何在Oracle中去掉文件扩展名(.docx、.pdf等),同时将分隔数据从单个列中分离出来

Sql 如何在Oracle中去掉文件扩展名(.docx、.pdf等),同时将分隔数据从单个列中分离出来,sql,oracle,Sql,Oracle,所以我得到了这样的东西: (本例中,3个空格为分隔符) 我已设法将这3个实体分成3列。然而;我还有最后一步;我试图从FileName.xml中去掉“.xml” 我得到了以下信息,但不起作用: select SUBSTR(SUBSTR(data_String, - instr(reverse(data_String), ' ' + 1)), nullif( instr(SUBSTR(data_String, - instr(reverse(data_String), ' '

所以我得到了这样的东西: (本例中,3个空格为分隔符)

我已设法将这3个实体分成3列。然而;我还有最后一步;我试图从FileName.xml中去掉“.xml”

我得到了以下信息,但不起作用:

select 
   SUBSTR(SUBSTR(data_String, - instr(reverse(data_String), '   ' + 1)), 
   nullif( instr(SUBSTR(data_String, - instr(reverse(data_String), '   ') + 1), '.', -1) +1, 1) )
提前谢谢

Oracle 11g R2架构设置

CREATE TABLE table_name ( data_string ) AS
SELECT 'C:\Desktop   JSchmoe   FileName.xml' FROM DUAL;
SELECT SUBSTR(
         data_string,
         1,
         INSTR( data_string, '   ' )
       ) AS filepath,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ' ) + 3,
         INSTR( data_string, '   ', - 1 ) - INSTR( data_string, '   ' ) - 2
       ) AS name,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ', -1 ) + 3,
         INSTR( data_string, '.', -1 ) - INSTR( data_string, '   ', -1 ) - 3
       ) As filename,
       SUBSTR(
         data_string,
         INSTR( data_string, '.', -1 ) + 1
       ) As extension
FROM   table_name
|    FILEPATH |     NAME | FILENAME | EXTENSION |
|-------------|----------|----------|-----------|
| C:\Desktop  | JSchmoe  | FileName |       xml |
SELECT REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 1 )
         AS filepath,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 2 )
         AS name,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 3 )
         AS filename,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 5 )
         AS extension
FROM   table_name
|   FILEPATH |    NAME | FILENAME | EXTENSION |
|------------|---------|----------|-----------|
| C:\Desktop | JSchmoe | FileName |       xml |
查询1-字符串函数

CREATE TABLE table_name ( data_string ) AS
SELECT 'C:\Desktop   JSchmoe   FileName.xml' FROM DUAL;
SELECT SUBSTR(
         data_string,
         1,
         INSTR( data_string, '   ' )
       ) AS filepath,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ' ) + 3,
         INSTR( data_string, '   ', - 1 ) - INSTR( data_string, '   ' ) - 2
       ) AS name,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ', -1 ) + 3,
         INSTR( data_string, '.', -1 ) - INSTR( data_string, '   ', -1 ) - 3
       ) As filename,
       SUBSTR(
         data_string,
         INSTR( data_string, '.', -1 ) + 1
       ) As extension
FROM   table_name
|    FILEPATH |     NAME | FILENAME | EXTENSION |
|-------------|----------|----------|-----------|
| C:\Desktop  | JSchmoe  | FileName |       xml |
SELECT REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 1 )
         AS filepath,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 2 )
         AS name,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 3 )
         AS filename,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 5 )
         AS extension
FROM   table_name
|   FILEPATH |    NAME | FILENAME | EXTENSION |
|------------|---------|----------|-----------|
| C:\Desktop | JSchmoe | FileName |       xml |

CREATE TABLE table_name ( data_string ) AS
SELECT 'C:\Desktop   JSchmoe   FileName.xml' FROM DUAL;
SELECT SUBSTR(
         data_string,
         1,
         INSTR( data_string, '   ' )
       ) AS filepath,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ' ) + 3,
         INSTR( data_string, '   ', - 1 ) - INSTR( data_string, '   ' ) - 2
       ) AS name,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ', -1 ) + 3,
         INSTR( data_string, '.', -1 ) - INSTR( data_string, '   ', -1 ) - 3
       ) As filename,
       SUBSTR(
         data_string,
         INSTR( data_string, '.', -1 ) + 1
       ) As extension
FROM   table_name
|    FILEPATH |     NAME | FILENAME | EXTENSION |
|-------------|----------|----------|-----------|
| C:\Desktop  | JSchmoe  | FileName |       xml |
SELECT REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 1 )
         AS filepath,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 2 )
         AS name,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 3 )
         AS filename,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 5 )
         AS extension
FROM   table_name
|   FILEPATH |    NAME | FILENAME | EXTENSION |
|------------|---------|----------|-----------|
| C:\Desktop | JSchmoe | FileName |       xml |
查询2-正则表达式

CREATE TABLE table_name ( data_string ) AS
SELECT 'C:\Desktop   JSchmoe   FileName.xml' FROM DUAL;
SELECT SUBSTR(
         data_string,
         1,
         INSTR( data_string, '   ' )
       ) AS filepath,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ' ) + 3,
         INSTR( data_string, '   ', - 1 ) - INSTR( data_string, '   ' ) - 2
       ) AS name,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ', -1 ) + 3,
         INSTR( data_string, '.', -1 ) - INSTR( data_string, '   ', -1 ) - 3
       ) As filename,
       SUBSTR(
         data_string,
         INSTR( data_string, '.', -1 ) + 1
       ) As extension
FROM   table_name
|    FILEPATH |     NAME | FILENAME | EXTENSION |
|-------------|----------|----------|-----------|
| C:\Desktop  | JSchmoe  | FileName |       xml |
SELECT REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 1 )
         AS filepath,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 2 )
         AS name,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 3 )
         AS filename,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 5 )
         AS extension
FROM   table_name
|   FILEPATH |    NAME | FILENAME | EXTENSION |
|------------|---------|----------|-----------|
| C:\Desktop | JSchmoe | FileName |       xml |

CREATE TABLE table_name ( data_string ) AS
SELECT 'C:\Desktop   JSchmoe   FileName.xml' FROM DUAL;
SELECT SUBSTR(
         data_string,
         1,
         INSTR( data_string, '   ' )
       ) AS filepath,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ' ) + 3,
         INSTR( data_string, '   ', - 1 ) - INSTR( data_string, '   ' ) - 2
       ) AS name,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ', -1 ) + 3,
         INSTR( data_string, '.', -1 ) - INSTR( data_string, '   ', -1 ) - 3
       ) As filename,
       SUBSTR(
         data_string,
         INSTR( data_string, '.', -1 ) + 1
       ) As extension
FROM   table_name
|    FILEPATH |     NAME | FILENAME | EXTENSION |
|-------------|----------|----------|-----------|
| C:\Desktop  | JSchmoe  | FileName |       xml |
SELECT REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 1 )
         AS filepath,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 2 )
         AS name,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 3 )
         AS filename,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 5 )
         AS extension
FROM   table_name
|   FILEPATH |    NAME | FILENAME | EXTENSION |
|------------|---------|----------|-----------|
| C:\Desktop | JSchmoe | FileName |       xml |

Oracle 11g R2架构设置

CREATE TABLE table_name ( data_string ) AS
SELECT 'C:\Desktop   JSchmoe   FileName.xml' FROM DUAL;
SELECT SUBSTR(
         data_string,
         1,
         INSTR( data_string, '   ' )
       ) AS filepath,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ' ) + 3,
         INSTR( data_string, '   ', - 1 ) - INSTR( data_string, '   ' ) - 2
       ) AS name,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ', -1 ) + 3,
         INSTR( data_string, '.', -1 ) - INSTR( data_string, '   ', -1 ) - 3
       ) As filename,
       SUBSTR(
         data_string,
         INSTR( data_string, '.', -1 ) + 1
       ) As extension
FROM   table_name
|    FILEPATH |     NAME | FILENAME | EXTENSION |
|-------------|----------|----------|-----------|
| C:\Desktop  | JSchmoe  | FileName |       xml |
SELECT REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 1 )
         AS filepath,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 2 )
         AS name,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 3 )
         AS filename,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 5 )
         AS extension
FROM   table_name
|   FILEPATH |    NAME | FILENAME | EXTENSION |
|------------|---------|----------|-----------|
| C:\Desktop | JSchmoe | FileName |       xml |
查询1-字符串函数

CREATE TABLE table_name ( data_string ) AS
SELECT 'C:\Desktop   JSchmoe   FileName.xml' FROM DUAL;
SELECT SUBSTR(
         data_string,
         1,
         INSTR( data_string, '   ' )
       ) AS filepath,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ' ) + 3,
         INSTR( data_string, '   ', - 1 ) - INSTR( data_string, '   ' ) - 2
       ) AS name,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ', -1 ) + 3,
         INSTR( data_string, '.', -1 ) - INSTR( data_string, '   ', -1 ) - 3
       ) As filename,
       SUBSTR(
         data_string,
         INSTR( data_string, '.', -1 ) + 1
       ) As extension
FROM   table_name
|    FILEPATH |     NAME | FILENAME | EXTENSION |
|-------------|----------|----------|-----------|
| C:\Desktop  | JSchmoe  | FileName |       xml |
SELECT REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 1 )
         AS filepath,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 2 )
         AS name,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 3 )
         AS filename,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 5 )
         AS extension
FROM   table_name
|   FILEPATH |    NAME | FILENAME | EXTENSION |
|------------|---------|----------|-----------|
| C:\Desktop | JSchmoe | FileName |       xml |

CREATE TABLE table_name ( data_string ) AS
SELECT 'C:\Desktop   JSchmoe   FileName.xml' FROM DUAL;
SELECT SUBSTR(
         data_string,
         1,
         INSTR( data_string, '   ' )
       ) AS filepath,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ' ) + 3,
         INSTR( data_string, '   ', - 1 ) - INSTR( data_string, '   ' ) - 2
       ) AS name,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ', -1 ) + 3,
         INSTR( data_string, '.', -1 ) - INSTR( data_string, '   ', -1 ) - 3
       ) As filename,
       SUBSTR(
         data_string,
         INSTR( data_string, '.', -1 ) + 1
       ) As extension
FROM   table_name
|    FILEPATH |     NAME | FILENAME | EXTENSION |
|-------------|----------|----------|-----------|
| C:\Desktop  | JSchmoe  | FileName |       xml |
SELECT REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 1 )
         AS filepath,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 2 )
         AS name,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 3 )
         AS filename,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 5 )
         AS extension
FROM   table_name
|   FILEPATH |    NAME | FILENAME | EXTENSION |
|------------|---------|----------|-----------|
| C:\Desktop | JSchmoe | FileName |       xml |
查询2-正则表达式

CREATE TABLE table_name ( data_string ) AS
SELECT 'C:\Desktop   JSchmoe   FileName.xml' FROM DUAL;
SELECT SUBSTR(
         data_string,
         1,
         INSTR( data_string, '   ' )
       ) AS filepath,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ' ) + 3,
         INSTR( data_string, '   ', - 1 ) - INSTR( data_string, '   ' ) - 2
       ) AS name,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ', -1 ) + 3,
         INSTR( data_string, '.', -1 ) - INSTR( data_string, '   ', -1 ) - 3
       ) As filename,
       SUBSTR(
         data_string,
         INSTR( data_string, '.', -1 ) + 1
       ) As extension
FROM   table_name
|    FILEPATH |     NAME | FILENAME | EXTENSION |
|-------------|----------|----------|-----------|
| C:\Desktop  | JSchmoe  | FileName |       xml |
SELECT REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 1 )
         AS filepath,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 2 )
         AS name,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 3 )
         AS filename,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 5 )
         AS extension
FROM   table_name
|   FILEPATH |    NAME | FILENAME | EXTENSION |
|------------|---------|----------|-----------|
| C:\Desktop | JSchmoe | FileName |       xml |

CREATE TABLE table_name ( data_string ) AS
SELECT 'C:\Desktop   JSchmoe   FileName.xml' FROM DUAL;
SELECT SUBSTR(
         data_string,
         1,
         INSTR( data_string, '   ' )
       ) AS filepath,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ' ) + 3,
         INSTR( data_string, '   ', - 1 ) - INSTR( data_string, '   ' ) - 2
       ) AS name,
       SUBSTR(
         data_string,
         INSTR( data_string, '   ', -1 ) + 3,
         INSTR( data_string, '.', -1 ) - INSTR( data_string, '   ', -1 ) - 3
       ) As filename,
       SUBSTR(
         data_string,
         INSTR( data_string, '.', -1 ) + 1
       ) As extension
FROM   table_name
|    FILEPATH |     NAME | FILENAME | EXTENSION |
|-------------|----------|----------|-----------|
| C:\Desktop  | JSchmoe  | FileName |       xml |
SELECT REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 1 )
         AS filepath,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 2 )
         AS name,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 3 )
         AS filename,
       REGEXP_SUBSTR( data_string, '^(.+?)   (.+?)   (.+)(\.(.*))?$', 1, 1, NULL, 5 )
         AS extension
FROM   table_name
|   FILEPATH |    NAME | FILENAME | EXTENSION |
|------------|---------|----------|-----------|
| C:\Desktop | JSchmoe | FileName |       xml |

这就是regexp派上用场的地方。这将删除句点char后面结尾处的所有字母a-z,包括句点:

select regexp_replace(filename,'\.[a-zA-Z]+$') filename_wo_extension
from files;
如果只想删除某些扩展,请使用:

regexp_replace(filename,'\.(docx|pdf|xml)$')
要包括数字和
-
以及
-
,并将扩展中的最大字符数限制为10:

regexp_replace(filename,'\.[a-zA-Z0-9\-\_]{1,10}$')

此限制不会更改
文件名中的任何内容。使用.very_long_不是扩展名
,而是
。末尾的long_ext
将被删除。

这就是regexp派上用场的地方。这将删除句点char后面结尾处的所有字母a-z,包括句点:

select regexp_replace(filename,'\.[a-zA-Z]+$') filename_wo_extension
from files;
如果只想删除某些扩展,请使用:

regexp_replace(filename,'\.(docx|pdf|xml)$')
要包括数字和
-
以及
-
,并将扩展中的最大字符数限制为10:

regexp_replace(filename,'\.[a-zA-Z0-9\-\_]{1,10}$')

此限制将不会更改
文件名中的任何内容。如果扩展名为.very_long_not_
但扩展名为
,则末尾的.long_ext
将被删除。

假设某些文件可能没有扩展名,您也需要处理这种情况。如果您需要速度,仍然可以使用INSTR/SUBSTR完成;但是,使用正则表达式编写和维护更容易。比如:

with
  inputs ( data_string ) as (
    select 'C:\Desktop   JSchmoe   FileName.xml'                from dual union all
    select 'E:\CD Drive   Someone Else   FileName_no_extension' from dual
  )
select regexp_substr(data_string, '(.*?)\s{3}', 1, 1, null, 1)              as filepath,
       regexp_substr(data_string, '(.*?)\s{3}', 1, 2, null, 1)              as username,
       regexp_substr(data_string, '(.*?\s{3}){2}(.*)(\.|$)', 1, 1, null, 2) as filename
from   inputs
;

FILEPATH     USERNAME         FILENAME               
------------ ---------------- ------------------------
C:\Desktop   JSchmoe          FileName                
E:\CD Drive  Someone Else     FileName_no_extension  
编辑:文件名可能包含多个点,例如
“report.march2017.pdf”
。在这种情况下,只有最后一个点和它后面的内容必须去掉。要处理这种情况,必须修改第三列的搜索模式。这里有一个方法:

with
  inputs ( data_string ) as (
    select 'C:\Desktop   JSchmoe   FileName.xml'                from dual union all
    select 'E:\CD Drive   Someone Else   FileName_no_extension' from dual union all
    select 'F:\SomeDrive   mathguy   File.dot.ext'              from dual
  )
select regexp_substr(data_string, '(.*?)\s{3}', 1, 1, null, 1)              as filepath,
       regexp_substr(data_string, '(.*?)\s{3}', 1, 2, null, 1)              as username,
       regexp_substr(data_string, '(.*?\s{3}){2}(.*?)(\.[^.]*)?$', 1, 1, null, 2) as filename
from   inputs
;

FILEPATH     USERNAME         FILENAME               
------------ ---------------- ------------------------
C:\Desktop   JSchmoe          FileName                
E:\CD Drive  Someone Else     FileName_no_extension  
F:\SomeDrive mathguy          File.dot 
'(.*?\s{3}){2}(.*?(\...[^.]*)?$)搜索模式的解释
搜索模式:

  • *?
    匹配任意数量的字符(零个或更多),尽可能少 需要,同时仍允许匹配整个模式
  • \s
    表示一个空格
    \s{3}
    表示正好有三个空格
  • (.*\s{3}{2}
    表示两次出现(某物,尽可能短,后跟三个空格)。所以这应该把我们带到输入的第三个“部分”
  • 现在从模式的末尾读取:
    $
    是字符串锚点的末尾
  • \。
    是一个单点字符<代码>[^.]是任何单个点字符
    (\..[^.*])?
    表示:可选(如果可能)-这是问号的含义-一个点后跟零个或多个非点。这将是延伸,锚定在字符串的末端
  • 左边只有
    (.*)
    :在第二次出现的三个空格和扩展名之间有零个或多个字符,如果有,则为字符串的结尾。这正是文件名,没有扩展名(如果有扩展名的话),它位于整个匹配模式的第二组括号中,因此我们可以在REGEXP_SUBSTR的最后一个参数中将其称为“2”

假设某些文件可能没有扩展名,您也需要处理这种情况。如果您需要速度,仍然可以使用INSTR/SUBSTR完成;但是,使用正则表达式编写和维护更容易。比如:

with
  inputs ( data_string ) as (
    select 'C:\Desktop   JSchmoe   FileName.xml'                from dual union all
    select 'E:\CD Drive   Someone Else   FileName_no_extension' from dual
  )
select regexp_substr(data_string, '(.*?)\s{3}', 1, 1, null, 1)              as filepath,
       regexp_substr(data_string, '(.*?)\s{3}', 1, 2, null, 1)              as username,
       regexp_substr(data_string, '(.*?\s{3}){2}(.*)(\.|$)', 1, 1, null, 2) as filename
from   inputs
;

FILEPATH     USERNAME         FILENAME               
------------ ---------------- ------------------------
C:\Desktop   JSchmoe          FileName                
E:\CD Drive  Someone Else     FileName_no_extension  
编辑:文件名可能包含多个点,例如
“report.march2017.pdf”
。在这种情况下,只有最后一个点和它后面的内容必须去掉。要处理这种情况,必须修改第三列的搜索模式。这里有一个方法:

with
  inputs ( data_string ) as (
    select 'C:\Desktop   JSchmoe   FileName.xml'                from dual union all
    select 'E:\CD Drive   Someone Else   FileName_no_extension' from dual union all
    select 'F:\SomeDrive   mathguy   File.dot.ext'              from dual
  )
select regexp_substr(data_string, '(.*?)\s{3}', 1, 1, null, 1)              as filepath,
       regexp_substr(data_string, '(.*?)\s{3}', 1, 2, null, 1)              as username,
       regexp_substr(data_string, '(.*?\s{3}){2}(.*?)(\.[^.]*)?$', 1, 1, null, 2) as filename
from   inputs
;

FILEPATH     USERNAME         FILENAME               
------------ ---------------- ------------------------
C:\Desktop   JSchmoe          FileName                
E:\CD Drive  Someone Else     FileName_no_extension  
F:\SomeDrive mathguy          File.dot 
'(.*?\s{3}){2}(.*?(\...[^.]*)?$)搜索模式的解释
搜索模式:

  • *?
    匹配任意数量的字符(零个或更多),尽可能少 需要,同时仍允许匹配整个模式
  • \s
    表示一个空格
    \s{3}
    表示正好有三个空格
  • (.*\s{3}{2}
    表示两次出现(某物,尽可能短,后跟三个空格)。所以这应该把我们带到输入的第三个“部分”
  • 现在从模式的末尾读取:
    $
    是字符串锚点的末尾
  • \。
    是一个单点字符<代码>[^.]是任何单个点字符
    (\..[^.*])?
    表示:可选(如果可能)-这是问号的含义-一个点后跟零个或多个非点。这将是延伸,锚定在字符串的末端
  • 左边只有
    (.*)
    :在第二次出现的三个空格和扩展名之间有零个或多个字符,如果有,则为字符串的结尾。这正是文件名,没有扩展名(如果有扩展名的话),它位于整个匹配模式的第二组括号中,因此我们可以在REGEXP_SUBSTR的最后一个参数中将其称为“2”

如何处理没有扩展名的文件名?有两个点的文件名-例如
'REPORT.MARCH2017.PDF'
?我希望REPORT.MARCH2017显示出来如果您的数据中确实有这样的文件名,您可能需要仔细测试各种解决方案,看看它们是否正确处理。(我相信到目前为止我发布的内容没有-我会检查。)好的-我编辑了我对韩的回答