在 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
您可以使用(快速)字符串函数(而不是慢速正则表达式)来做到这一点:
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
我有 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
您可以使用(快速)字符串函数(而不是慢速正则表达式)来做到这一点:
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