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

Presto SQL如何提取字符串中最后一个ref_button_id对应的值?

Presto SQL提取字符串中最后一次出现的ref_button_id取值的规范方案

你需要从包含重复ref_button_id键值对的字符串中提取最后一次出现的对应取值,现有嵌套reverse和split的方法虽然可行,但可读性较差,以下是几种更规范、易维护的解决方案:

方案一:正则表达式反向匹配(推荐)

利用Presto的regexp_replace函数,通过正则表达式匹配最后一个ref_button_id的键值对并提取值,代码简洁且可读性强:

SELECT regexp_replace(
    'ref_button_id=pivot-rows5&ref_button_id=hhh-rows&',
    '.*ref_button_id=([^&]+).*',
    '$1'
) AS ref_button_id;
  • 正则说明:
    • .*:贪婪匹配任意字符,直到找到最后一处ref_button_id=
    • ([^&]+):捕获&之前的所有字符(即目标取值)
    • $1:将整个字符串替换为捕获到的目标取值

方案二:简化版reverse+split_part

保留反转思路,但用split_part替代嵌套split,减少层级提升可读性:

SELECT reverse(split_part(reverse('ref_button_id=pivot-rows5&ref_button_id=hhh-rows&'), '=di_nottub_fer', 2)) AS ref_button_id;
  • 逻辑说明:
    1. 反转原字符串,将ref_button_id=转为=di_nottub_fer
    2. 用反转后的键分割字符串,取第二部分(即反转后的目标值)
    3. 再次反转得到原始格式的目标取值

方案三:strpos+substring定位截取

通过定位最后一个ref_button_id=的位置和后续第一个&的位置,精准截取目标值,适合对正则不熟悉的场景:

WITH input_str AS (
    SELECT 'ref_button_id=pivot-rows5&ref_button_id=hhh-rows&' AS str
)
SELECT substring(
    str,
    last_pos + length('ref_button_id='),
    next_amp - (last_pos + length('ref_button_id='))
) AS ref_button_id
FROM input_str
CROSS JOIN (
    SELECT strpos(str, 'ref_button_id=', strpos(str, 'ref_button_id=') + 1) AS last_pos
    FROM input_str
) AS pos1
CROSS JOIN (
    SELECT strpos(str, '&', last_pos + length('ref_button_id=')) AS next_amp
    FROM input_str, pos1
);
  • 逻辑说明:
    1. 先用strpos找到第一个ref_button_id=的位置,再以此为起点找下一个(即最后一个)的位置
    2. 找到该位置之后第一个&的位置
    3. 通过substring截取两个位置之间的内容作为目标取值

内容的提问来源于stack exchange,提问作者Crubal Chenxi Li

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:35:19