如何从多值字符串中精准提取DL:后的内容?(Oracle SQL场景)
提取字符串中DL:后的目标内容(Oracle环境)
现有函数pck_import.GETdocnumber(XML_DATA)返回多值组合字符串,需要提取所有DL:之后的内容(内容可能包含字母数字,DL:可位于字符串开头、中间或结尾)。之前使用的代码会带出Pr:等无关内容,以下是正确的提取方法:
原有错误代码
substr(pck_import.GETdocnumber(XML_DATA), instr(pck_import.GETdocnumber(XML_DATA), 'DL:') + 3))
输入示例
pck_import.GETdocnumber(XML_DATA)
DL:2212200090001 Pr:8222046017
Obj:020220215541 DL:1099089729
DL:DST22017260
DL:22122000123964 Pr:8222062485
DL:22122000108599
Obj:0202200015539 DL:2100001688
期望输出
OUTPUT
2212200090001
1099089729
DST22017260
22122000123964
22122000108599
2100001688
正确提取方法
方法1:结合INSTR和SUBSTR精准截取
通过定位DL:的位置,再截取到下一个空格(若存在)或字符串末尾,避免带出后续无关内容:
SELECT TRIM( SUBSTR( doc_str, INSTR(doc_str, 'DL:') + 3, CASE WHEN INSTR(doc_str, ' ', INSTR(doc_str, 'DL:')) > 0 THEN INSTR(doc_str, ' ', INSTR(doc_str, 'DL:')) - (INSTR(doc_str, 'DL:') + 3) ELSE LENGTH(doc_str) - (INSTR(doc_str, 'DL:') + 3) + 1 END ) ) AS dl_content FROM ( SELECT pck_import.GETdocnumber(XML_DATA) AS doc_str FROM your_table );
- 先通过
INSTR(doc_str, 'DL:') + 3定位到DL:后的起始位置 - 用
INSTR(doc_str, ' ', INSTR(doc_str, 'DL:'))查找DL:后第一个空格的位置,以此计算截取长度;若无空格则截取到字符串末尾 TRIM用于清除可能存在的首尾空格
方法2:正则表达式截取(Oracle 11g及以上)
用REGEXP_SUBSTR直接匹配DL:后的非空格内容,写法更简洁:
SELECT REGEXP_SUBSTR(pck_import.GETdocnumber(XML_DATA), 'DL:([^ ]+)', 1, 1, NULL, 1) AS dl_content FROM your_table;
DL:([^ ]+):匹配DL:开头,捕获所有后续非空格字符- 最后一个参数
1指定返回第一个捕获组的内容,即DL:之后的目标字符串
方法3:封装自定义函数复用
如果需要多次提取,可封装成函数方便调用:
CREATE OR REPLACE FUNCTION extract_dl_content(p_input_str VARCHAR2) RETURN VARCHAR2 IS v_start_pos NUMBER; v_end_pos NUMBER; BEGIN v_start_pos := INSTR(p_input_str, 'DL:') + 3; IF v_start_pos <= 3 THEN -- 未找到DL:标记 RETURN NULL; END IF; v_end_pos := INSTR(p_input_str, ' ', v_start_pos); IF v_end_pos = 0 THEN RETURN TRIM(SUBSTR(p_input_str, v_start_pos)); ELSE RETURN TRIM(SUBSTR(p_input_str, v_start_pos, v_end_pos - v_start_pos)); END IF; END; / -- 调用示例 SELECT extract_dl_content(pck_import.GETdocnumber(XML_DATA)) AS dl_content FROM your_table;
内容的提问来源于stack exchange,提问作者seesharp
相关产品推荐
相关产品推荐

