Redshift SQL正则提取:从URL中获取最后一个name参数对应值
提取Redshift SQL中最后一次出现的name参数值
正则表达式方案(推荐)
使用Redshift内置的REGEXP_SUBSTR函数,结合正则匹配逻辑直接提取目标内容:
SELECT REGEXP_SUBSTR( url, 'name[=%]([^&]+)(?:&|$)', 1, 1, 'e' ) AS extracted_name FROM your_table;
正则规则说明:
name[=%]:精准匹配最后一次出现的name,并匹配其后紧跟的=或%符号([^&]+):捕获=/%之后到下一个&之前的所有字符(即我们需要的目标值)(?:&|$):匹配结束边界,要么是参数分隔符&,要么是字符串结尾(非捕获组,不干扰结果提取)- 参数
1,1:指定从字符串起始位置开始匹配,取第一个有效匹配结果(正则的贪婪特性会自动定位到最后一次出现的name) - 参数
'e':表示直接返回捕获组中的内容,无需额外处理
测试验证
针对你提供的测试字符串:
http://bunnytalks.com/goingOn?name=Bunny&phone=2340 http://bunnytalks.com/goingOn?name=Bunny http://bunnytalks.com/goingOn?name=Talks/whatson%goingOn%name%Bunny http://bunnytalks.com/goingOn?name=Talks/whatson%goingOn%name%Bunny&phone=2340
执行上述SQL后,所有结果均返回Bunny,完全符合需求。
纯字符串操作方案(备选)
如果偏好不用正则,可通过字符串反转、截取再反转的逻辑实现:
SELECT REVERSE( SUBSTRING( REVERSE(url), CASE WHEN POSITION('&' IN REVERSE(url)) = 0 THEN 1 ELSE POSITION('&' IN REVERSE(url)) + 1 END, POSITION('eman' IN REVERSE(url)) - CASE WHEN POSITION('&' IN REVERSE(url)) = 0 THEN 1 ELSE POSITION('&' IN REVERSE(url)) + 1 END - 2 ) ) AS extracted_name FROM your_table;
该方法通过反转字符串,将“找最后一次出现的name”转化为“找第一次出现的eman”,再截取目标区间后反转还原。不过可读性弱于正则方案,仅作为备选。
内容的提问来源于stack exchange,提问作者Bunny Talks
相关产品推荐
相关产品推荐

