Oracle中如何从SAP_ID列提取指定中间子串(如ENB)
提取SAP_ID字段中的指定子串
根据你提供的SAP_ID格式(示例:I-JK-SGAR-ENB-H021),目标是提取其中的ENB部分,以下是针对不同数据库环境修改后的查询语句:
MySQL/MariaDB 版本
利用SUBSTRING_INDEX函数分层截取:
select SAP_ID, SUBSTRING_INDEX(SUBSTRING_INDEX(SAP_ID, '-', 4), '-', -1) AS EXTRACTED_ENB, SITE_TYPE, SITEBACKHAUL, PRIORITY_SITE, RJ_COMPANY_CODE_1, BUSINESSRANKING, USAGE_TYPE, '1' AS STATUS FROM R4G_OSP.ENODEB where SAP_ID IS NOT NULL;
逻辑说明:先截取前4个分隔符以内的内容(I-JK-SGAR-ENB),再从该结果中截取最后一个分隔符后的内容,得到ENB。
Oracle 版本
使用正则表达式函数REGEXP_SUBSTR匹配目标子串:
select SAP_ID, REGEXP_SUBSTR(SAP_ID, '[^-]+', 1, 4) AS EXTRACTED_ENB, SITE_TYPE, SITEBACKHAUL, PRIORITY_SITE, RJ_COMPANY_CODE_1, BUSINESSRANKING, USAGE_TYPE, '1' AS STATUS FROM R4G_OSP.ENODEB where SAP_ID IS NOT NULL;
逻辑说明:[^-]+匹配所有非-的连续字符,指定取第4个匹配项,直接得到ENB。
SQL Server 版本
方法1(2016及以上版本,使用STRING_SPLIT)
select e.SAP_ID, (select value from STRING_SPLIT(e.SAP_ID, '-') order by (select null) offset 3 rows fetch next 1 row only) AS EXTRACTED_ENB, e.SITE_TYPE, e.SITEBACKHAUL, e.PRIORITY_SITE, e.RJ_COMPANY_CODE_1, e.BUSINESSRANKING, e.USAGE_TYPE, '1' AS STATUS FROM R4G_OSP.ENODEB e where e.SAP_ID IS NOT NULL;
逻辑说明:拆分字符串后,偏移3行(对应第4个元素)并取1行数据,得到ENB。
方法2(兼容低版本,使用XML转换)
select SAP_ID, CAST('<t>' + REPLACE(SAP_ID, '-', '</t><t>') + '</t>' AS XML).value('/t[4]', 'VARCHAR(100)') AS EXTRACTED_ENB, SITE_TYPE, SITEBACKHAUL, PRIORITY_SITE, RJ_COMPANY_CODE_1, BUSINESSRANKING, USAGE_TYPE, '1' AS STATUS FROM R4G_OSP.ENODEB where SAP_ID IS NOT NULL;
逻辑说明:将字符串转换为XML节点,直接提取第4个节点的内容。
适配可变格式场景
如果SAP_ID的段数不固定,但ENB始终是倒数第二段,可以调整截取逻辑:
- MySQL/MariaDB:
SUBSTRING_INDEX(SUBSTRING_INDEX(SAP_ID, '-', -2), '-', 1) - Oracle:
REGEXP_SUBSTR(SAP_ID, '[^-]+', 1, REGEXP_COUNT(SAP_ID, '-')) - SQL Server:类似思路,先获取总段数再取倒数第二段。
内容的提问来源于stack exchange,提问作者Nadeem
相关产品推荐
相关产品推荐

