亚马逊红移中的 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 中的“匹配但排除”