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

如何从列中提取子字符串?求提取FRP值的正确SQL语句

从分隔键值对字符串中提取FRP字段值的SQL解决方法

给定的目标字符串格式如下:

Entity=10||WorkdayReferenceID=9000100102||HCMCostCenterMgr=svigeant@broadinstitute.org||FRP=100007071||BGType=Organizational||SalAllow=Y||ConcurAtlasAllow=Y||EBAllow=Y||

需要提取FRP对应的字段值100007071。

你的原SQL问题分析

你写的SQL依赖字段的固定顺序(第4个=和第4个||),一旦字段顺序调整就会直接失效;另外SUBSTR的长度计算有误——SUBSTR的第三个参数是子串长度,不是结束位置,你直接用INSTR(..., '||',1,4)-1得到的是结束位置,需要减去值的起始位置才是正确长度。

推荐方案(不依赖字段顺序,更鲁棒)

直接定位FRP=的位置,再找其后第一个||的位置,精准提取中间值:

SELECT 
  TRIM(
    SUBSTR(
      TL.DESCRIPTION,
      INSTR(TL.DESCRIPTION, 'FRP=') + 4, -- 跳过"FRP="这4个字符,定位到值的起始位
      INSTR(TL.DESCRIPTION, '||', INSTR(TL.DESCRIPTION, 'FRP=')) - (INSTR(TL.DESCRIPTION, 'FRP=') + 4)
    )
  ) AS FRP_VALUE
FROM YOUR_TABLE TL;

逻辑说明

  1. INSTR(TL.DESCRIPTION, 'FRP=')找到FRP=在字符串中的起始索引
  2. 加4是因为FRP=共4个字符,跳过之后就是目标值的第一个字符
  3. 第二个INSTR找到FRP=之后第一个||的位置,减去值的起始位得到子串的长度
  4. TRIM用于清除可能存在的多余空格(如果字符串里有)

正则表达式方案(更简洁,需数据库支持)

如果你的数据库支持正则表达式函数(比如Oracle、MySQL 8+、PostgreSQL等),可以用一行代码解决:

Oracle 示例

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

MySQL 8+ 示例

SELECT REGEXP_SUBSTR(TL.DESCRIPTION, 'FRP=([^|]+)', 1, 1, 'c', 1) AS FRP_VALUE
FROM YOUR_TABLE TL;

逻辑说明

  • FRP=([^|]+):正则表达式匹配FRP=后面所有不是|的字符,([^|]+)是捕获组,专门提取目标值
  • 最后一个参数1表示返回第一个捕获组的内容,也就是我们要的FRP值

原SQL修复版(仅字段顺序固定时可用)

如果场景确定字段顺序不会变,也可以修复原SQL的长度计算问题:

SELECT 
  RTRIM(
    NVL(
      SUBSTR(
        TL.DESCRIPTION,
        INSTR(TL.DESCRIPTION, '=', 1, 4) + 1,
        INSTR(TL.DESCRIPTION, '||', 1, 4) - (INSTR(TL.DESCRIPTION, '=', 1, 4) + 1)
      ),
      0
    ),
    '|'
  ) AS FRP_VALUE
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.07.28 19:17:37