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

Presto SQL如何提取字符串最后一个连字符右侧的子串?

提取连字符分隔字符串最右侧后缀的解决方法

问题排查

你之前的两种写法都没命中需求:

  • substring(con.itemid,INSTR(con.itemid,'-')+1)只会截取第一个连字符后面的所有内容,碰到多连字符的字符串(比如AAAA-BBBB-PUB),会返回BBBB-PUB,不是你要的最右侧后缀。
  • 第二种写法里的正则-([^:]*)逻辑完全错了——[^:]是匹配除冒号外的字符,和连字符没关系,再加上SUBSTR(...,1,2)强行截两位,根本拿不到目标内容。

可行解决方案

方案1:正则表达式(通用推荐)

用正则定位最后一个连字符,捕获后面的内容,不同SQL方言写法略有不同:

支持regexp_extract的SQL(如Hive、Spark SQL)

SELECT regexp_extract(con.itemid, '.*-(.*)$', 1) AS itemid_suffix

逻辑:.*-匹配从字符串开头到最后一个连字符的所有内容,(.*)$捕获最后一个连字符后到结尾的所有字符,正好是你要的后缀。

MySQL 8.0+(用REGEXP_SUBSTR)

SELECT REGEXP_SUBSTR(con.itemid, '[^-]+$') AS itemid_suffix

逻辑:[^-]+$直接匹配字符串末尾所有非连字符的内容,也就是最后一个连字符后的后缀。

方案2:字符串反转法(兼容老版本SQL)

如果你的SQL环境不支持复杂正则,用反转字符串的方式绕一下:

-- 以Oracle为例,其他方言调整函数名即可
SELECT REVERSE(SUBSTR(REVERSE(con.itemid), 1, INSTR(REVERSE(con.itemid), '-') - 1)) AS itemid_suffix

步骤拆解:

  1. 反转原字符串,比如AAAA-BBBB-PUB变成BUP-BBBB-AAAA
  2. 找到反转后第一个连字符的位置,截取开头到该位置前的内容(得到BUP)
  3. 再反转一次,就得到原字符串最右侧的PUB

示例验证

拿AAAA-BBBB-PUB测试,方案1的代码会返回PUB;输入X-Y-Z-123会返回123,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:07:18