亚马逊红移中的 SQL 正则表达式 substr 函数

Posted

技术标签:

【中文标题】亚马逊红移中的 SQL 正则表达式 substr 函数【英文标题】:SQL Regex substr function in amazon redshift 【发布时间】:2018-06-18 10:19:45 【问题描述】:

在我的数据库中,有一个显示登录页面的表格,我要做的是分类流量是否来自 SEO 渠道。当着陆页与模式/countrycode/index.aspx完全相等时,则应视为'SEO',否则标记为'non-SEO'。

表格应该是这样的

    landing_page                               channel 
   /en/index.aspx                               SEO 
   /de/index.aspx                               SEO 
   /es/features/mobile-apps/index.aspx         Non-SEO 
   /ja/products/product01123                   Non-SEO 

为此,我在 Redshift 中编写了一个正则表达式,例如

   SELECT 
      landing_page, 
      CASE 
        WHEN 
          regexp_substr(landing_page, '/\/[a-z]2,4\/index.aspx')  IS NULL
        THEN 'Non-SEO' ELSE 'SEO'
      END channel 
   FROM 
      marketing_table

我在 regextester 中进行了测试,它非常适合我。但是,当我将它应用到 Redshift 中时,结果如下所示

    landing_page                               channel 
   /en/index.aspx                               SEO 
   /de/index.aspx                               SEO 
   /es/features/mobile-apps/index.aspx          SEO 
   /ja/products/product01123                    SEO
   /download/testing                           NON-SEO 

也就是说,/和/index.aspx之间的所有字符串都被考虑在内,我需要的是完全匹配。有什么建议可以解决吗?

非常感谢您的帮助!

更新:抱歉大家更新晚了。问题还没有解决。最令人困惑的一点是,对于同一个着陆页,不同流量,有的被认为是SEO,有的则不是,例如

        landing_page                               channel 
   /en/index.aspx                               SEO 
   /en/index.aspx                               Non-SEO

我们尝试了不同的方法,例如不使用正则表达式,而是使用字符串的长度,例如 (12,13,14,15,16) 中的 len(landing_page)。有人对此有任何想法吗?

【问题讨论】:

我的回答有帮助吗?请注意,您应该真正使用$ 来匹配字符串的结尾,并使用^ 来匹配字符串的开头。 【参考方案1】:

你应该使用

'/[a-z]2,4/index[.]aspx'

这里,/ 从一开始就被删除,[.] 用于匹配 literal 点。由于 Amazon Redshift 中的正则表达式不使用正则表达式分隔符,因此您无需使用 / 字符“包装”整个模式,也无需转义 /,因为它们不是特殊的正则表达式元字符。

【讨论】:

【参考方案2】:

@Wiktor-Stribiżew 在我上面的答案几乎是正确的。他缺少行首和行尾字符。 使用输入 URL 考虑以下情况:

/es/features/en/index.aspx

根据 OP,这不应归类为 SEO。但使用正则表达式 '/[a-z]2,4/index[.]aspx' 会。要使用的正确正则表达式是'^/[a-z]2,4/index[.]aspx$'

select regexp_substr('/es/features/en/index.aspx','/[a-z]2,4/index[.]aspx');
>>> /en/index.aspx
select regexp_substr('/es/features/en/index.aspx','^/[a-z]2,4/index[.]aspx$');
>>> null
select regexp_substr('/en/index.aspx','^/[a-z]2,4/index[.]aspx$');
>>> /en/index.aspx
select regexp_substr('/es/features/mobile-apps/index.aspx','^/[a-z]2,4/index[.]aspx$')
>>> null

【讨论】:

以上是关于亚马逊红移中的 SQL 正则表达式 substr 函数的主要内容,如果未能解决你的问题,请参考以下文章

亚马逊 Redshift 的 REGEXP_SUBSTR 中的“匹配但排除”

红移中的正则表达式

红移中的正则表达式

使用 SQL 的 Amazon Redshift 中的正则表达式

使用字符串函数反序列化亚马逊红移中的 php 对象

如何从亚马逊红移中的字符串中删除非数字字符(句号“。”除外)