Redshift中REGEXP_SUBSTR提取最后匹配子串返回空,求排查
Redshift REGEXP_SUBSTR 提取最后一个匹配子串问题解决
问题排查
你的SQL返回空值,核心原因是正则模式的匹配范围有限,且未指定提取最后一个匹配项的参数:
- 原模式中的
\\w+仅能匹配字母、数字和下划线,虽示例中的状态值符合,但正则解析时可能因转义逻辑导致匹配失效; - REGEXP_SUBSTR默认返回第一个匹配项,但你需要的是最后一个,且原模式的匹配逻辑存在局限。
修正方案
步骤1:修正正则模式
用[^'']+替代\\w+,该表达式能匹配单引号之间的任意非单引号字符,适配更复杂的状态值格式,同时避免转义歧义:
-- 测试匹配第一个符合格式的子串 select REGEXP_substr(' sfdfgdfg STATUS CHANGE FROM ''REGISTERED'' TO ''DISABLED'' ZD# 17564 REASON: CUSTO STATUS CHANGE FROM ''DISABLED'' TO ''HOLD'' ', 'STATUS CHANGE FROM ''[^'']+'' TO ''[^'']+''');
步骤2:提取最后一个匹配项
通过REGEXP_COUNT统计总匹配次数,再将该次数作为REGEXP_SUBSTR的occurrence参数,即可提取最后一个符合格式的子串:
WITH input_data AS ( SELECT ' sfdfgdfg STATUS CHANGE FROM ''REGISTERED'' TO ''DISABLED'' ZD# 17564 REASON: CUSTO STATUS CHANGE FROM ''DISABLED'' TO ''HOLD'' ' AS target_str ) SELECT REGEXP_SUBSTR( target_str, 'STATUS CHANGE FROM ''[^'']+'' TO ''[^'']+''', 1, REGEXP_COUNT(target_str, 'STATUS CHANGE FROM ''[^'']+'' TO ''[^'']+''') ) AS last_status_change FROM input_data;
执行上述SQL后,会返回最后一个状态变更子串:STATUS CHANGE FROM 'DISABLED' TO 'HOLD'
内容的提问来源于stack exchange,提问作者Xixi
相关产品推荐
相关产品推荐

