【问题标题】:SQL Regex substr function in amazon redshift亚马逊红移中的 SQL 正则表达式 substr 函数
【发布时间】: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)。有人对此有任何想法吗?

【问题讨论】:

  • 我的回答有帮助吗?请注意,您应该真正使用$ 来匹配字符串的结尾,并使用^ 来匹配字符串的开头。

标签: sql regex amazon-redshift


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 2021-02-28
      相关资源
      最近更新 更多