You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从多值字符串中精准提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:35:28