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

如何从多分隔符键值对字符串中提取HCMCostCenterMgr对应的邮箱?

问题描述

现有字段DESCRIPTION的内容格式如下:

Entity=10||WorkdayReferenceID=9000100332||HCMCostCenterMgr=nicoleb@broadinstitute.org||FRP=||

需要提取其中HCMCostCenterMgr对应的邮箱地址,预期输出为:

nicoleb@broadinstitute.org

此前使用的SQL语句依赖固定位置的=号(第3个),新增FRP字段后,字段顺序或数量变化导致语句失效,需适配任意位置的HCMCostCenterMgr字段的提取方法。

解决方案

通用字符串处理方案(适配多数数据库)

核心是通过字段名精准定位,而非依赖固定顺序:

SELECT 
  TRIM(
    SUBSTR(
      TL.DESCRIPTION,
      -- 找到"HCMCostCenterMgr="的起始位置,加上字段名长度得到值的起点
      INSTR(TL.DESCRIPTION, 'HCMCostCenterMgr=') + LENGTH('HCMCostCenterMgr='),
      -- 计算从值起点到下一个"||"的长度
      INSTR(TL.DESCRIPTION, '||', INSTR(TL.DESCRIPTION, 'HCMCostCenterMgr=')) 
      - (INSTR(TL.DESCRIPTION, 'HCMCostCenterMgr=') + LENGTH('HCMCostCenterMgr='))
    )
  ) AS CCM
FROM YOUR_TABLE TL;

Oracle 专用正则方案

利用正则表达式直接提取目标内容,写法更简洁:

SELECT 
  REGEXP_SUBSTR(TL.DESCRIPTION, 'HCMCostCenterMgr=([^|]+)', 1, 1, NULL, 1) AS CCM
FROM YOUR_TABLE TL;

说明:正则HCMCostCenterMgr=([^|]+)匹配字段名后直到第一个|的所有字符,最后一个参数1指定提取括号内的分组内容。

MySQL/MariaDB 专用方案

借助SUBSTRING_INDEX多层截取:

SELECT 
  TRIM(
    SUBSTRING_INDEX(
      -- 截取"HCMCostCenterMgr="之后的所有内容
      SUBSTRING_INDEX(TL.DESCRIPTION, 'HCMCostCenterMgr=', -1),
      -- 截取到第一个"||"为止
      '||', 1
    )
  ) AS CCM
FROM YOUR_TABLE TL;

PostgreSQL 专用方案

方法一:分割函数组合

SELECT 
  SPLIT_PART(
    -- 先定位到目标字段所在的"||"分割块
    SPLIT_PART(TL.DESCRIPTION, '||', POSITION('HCMCostCenterMgr=' IN TL.DESCRIPTION) / LENGTH('HCMCostCenterMgr=||') + 1),
    -- 分割出字段值
    '=', 2
  ) AS CCM
FROM YOUR_TABLE TL;

方法二:正则提取

SELECT 
  (REGEXP_MATCH(TL.DESCRIPTION, 'HCMCostCenterMgr=([^|]+)'))[1] AS CCM
FROM YOUR_TABLE TL;

内容的提问来源于stack exchange,提问作者varun dixit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:15:33