在 Oracle sql 中提取日期和名称

Extract date and name in Oracle sql

我有 prg_tbl table,其中我从 Filename 列中的目录插入文件名,值存储在 Filename 列中,如:

TRG_jira_creditentity_20220426.csv
TRG_jira_CRL_Boni_20220426.csv
TRG_jira_CRL_Branchen_20220426.csv
TRG_jira_CRL_Counterparty_20220426.csv
TRG_jira_CRL_KNE_20220426.csv
TRG_jira_CRL_Länder_20220426.csv

在一个 select 查询中,我想从该行中提取日期,例如 '20220426'。在另一个 select 查询中,我想提取文件名,例如 'TRG_jira_creditentity_'.

我不确定如何使用 select 查询来执行此操作,因为文件名中的日期发生了变化,但作为文件名一部分的前缀保持不变,例如 'TRG_jira_creditentity_'.

您想使用正则表达式(regexes)。例如:

SELECT REGEXP_SUBSTR( 'TRG_jira_creditentity_20220426.csv',
    'TRG_jira_creditentity_(\d+)\.csv', 1, 1, NULL, 1 ) from dual;

returns

20220426

此处我们搜索模式 \d+,表示字符串 TRG_jira_creditentity_ 后的“一个或多个数字”。

many tutorials on regexes out there, but note that all regex implementations are slightly different, and Oracle especially. Probably the best place to start would be the Oracle docs themselves, such as here,具体取决于您使用的 Oracle 版本 运行。

一种选择是使用 REGEXP_REPLACE() 函数,例如

SELECT REGEXP_REPLACE(filename,'^(.*_)([^.]*).*','') AS col1,
       REGEXP_REPLACE(filename,'[^_]+$') AS col2       
  FROM prg_tbl

Demo

您可以使用(快速)字符串函数(而不是慢速正则表达式)来做到这一点:

SELECT SUBSTR(value, 1, INSTR(value, '_', -1)) AS file_name,
       TO_DATE(
         SUBSTR(value, INSTR(value, '_', -1) + 1, 8),
         'YYYYMMDD'
       ) AS dt
FROM   table_name

如果您确实想使用(较慢的)正则表达式,那么您可以对两个部分使用相同的模式 ^(.*_)(\d{8}).csv$ 并提取不同的捕获组:

SELECT REGEXP_SUBSTR(value, '^(.*_)(\d{8}).csv$', 1, 1, NULL, 1) AS file_name,
       TO_DATE(
         REGEXP_SUBSTR(value, '^(.*_)(\d{8}).csv$', 1, 1, NULL, 2),
         'YYYYMMDD'
       ) AS dt
FROM   table_name

其中,对于示例数据:

CREATE TABLE table_name (value) AS
SELECT 'TRG_jira_creditentity_20220426.csv'     FROM DUAL UNION ALL
SELECT 'TRG_jira_CRL_Boni_20220426.csv'         FROM DUAL UNION ALL
SELECT 'TRG_jira_CRL_Branchen_20220426.csv'     FROM DUAL UNION ALL
SELECT 'TRG_jira_CRL_Counterparty_20220426.csv' FROM DUAL UNION ALL
SELECT 'TRG_jira_CRL_KNE_20220426.csv'          FROM DUAL UNION ALL
SELECT 'TRG_jira_CRL_Länder_20220426.csv'       FROM DUAL;

双输出:

FILE_NAME DT
TRG_jira_creditentity_ 2022-04-26 00:00:00
TRG_jira_CRL_Boni_ 2022-04-26 00:00:00
TRG_jira_CRL_Branchen_ 2022-04-26 00:00:00
TRG_jira_CRL_Counterparty_ 2022-04-26 00:00:00
TRG_jira_CRL_KNE_ 2022-04-26 00:00:00
TRG_jira_CRL_Länder_ 2022-04-26 00:00:00

db<>fiddle here