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
步骤拆解:
- 反转原字符串,比如
AAAA-BBBB-PUB变成BUP-BBBB-AAAA - 找到反转后第一个连字符的位置,截取开头到该位置前的内容(得到
BUP) - 再反转一次,就得到原字符串最右侧的
PUB
示例验证
拿AAAA-BBBB-PUB测试,方案1的代码会返回PUB;输入X-Y-Z-123会返回123,完全符合需求。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

