如何从列中提取子字符串?求提取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;
逻辑说明
INSTR(TL.DESCRIPTION, 'FRP=')找到FRP=在字符串中的起始索引- 加4是因为
FRP=共4个字符,跳过之后就是目标值的第一个字符 - 第二个
INSTR找到FRP=之后第一个||的位置,减去值的起始位得到子串的长度 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
相关产品推荐
相关产品推荐

