【问题标题】:REGEXP_SUBSTR RedshiftREGEXP_SUBSTR 红移
【发布时间】:2018-02-16 23:45:43
【问题描述】:

我正在尝试从 postgresql 中的文本字符串中提取子字符串。文本字符串的列名是 short_description,我正在使用 REGEXP_SUBSTR 函数来定义一个正则表达式,它将只返回我想要的部分:

SELECT  short_description, 
REGEXP_SUBSTR(short_description,'\\[[^=[]*') AS space
FROM my_table

这将返回以下内容:

short_description                                        space
----------------------------------------------------------------------------
[ABC12][1][ABCDEFG] ACB DEF [HIJ]           |            [ABC12]

我想拉的是以下内容:

short_description                                        space
----------------------------------------------------------------------------
[ABC12][1][ABCDEFG] ACB DEF [HIJ]           |            [ABCDEFG]

有什么想法吗?

【问题讨论】:

    标签: amazon-web-services amazon-redshift


    【解决方案1】:

    您可以使用Regex character classes 来帮助进行这种匹配。在这里,我只寻找字母,用括号括起来,然后是一个空格。注意使用双反斜杠 \\ 来转义文字括号和字符类的双括号 [[:a:]]

    SELECT REGEXP_SUBSTR('[ABC12][1][ABCDEFG] ACB DEF [HIJ]','\\[[[:alpha:]]+\\] ');
     regexp_substr
    ---------------
     [ABCDEFG]
    

    您还可以使用 SPLIT_PART 函数通过在右括号 ] 上拆分并选择第三个值来实现类似的效果。

    SELECT SPLIT_PART('[ABC12][1][ABCDEFG] ACB DEF [HIJ]',']',3);
     split_part
    ------------
     [ABCDEFG
    

    如果可能的话,我建议使用内置函数而不是 UDF。 UDF 在您需要时非常棒,但它们确实会导致性能损失。

    【讨论】:

    • 不确定性能但绝对使用这个而不是我的 UDF 版本! - 好答案!
    【解决方案2】:

    给你。 我找到了正确的正则表达式 https://txt2re.com

    然后,我将它实现为 python redshift UDF

    create or replace function f_regex (input_str varchar(max),regex_expression varchar(max))
      returns VARCHAR(max)
    stable
    as $$
    import re
    rg = re.compile(regex_expression,re.IGNORECASE|re.DOTALL)
    return rg.search(input_str).group(1)
    $$ language plpythonu;
    
    select f_regex('[ABC12][1][ABCDEFG] ACB DEF [HIJ] '::text,'.*?\\[.*?\\].*?\\[.*?\\](\\[.*?\\])'::text);
    

    创建函数后,您可以在任何 redshift 选择中使用它。

    所以,在你的情况下:

    SELECT  short_description, 
    f_regex(short_description::text,'.*?\\[.*?\\].*?\\[.*?\\](\\[.*?\\])'::text) AS space
    FROM my_table
    

    【讨论】:

      猜你喜欢
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 2014-11-16
      • 2014-02-19
      • 2019-01-19
      相关资源
      最近更新 更多