在 case 语句中使用正则表达式提取动态内容

Posted

技术标签:

【中文标题】在 case 语句中使用正则表达式提取动态内容【英文标题】:Using regex within a case statement to pull out dynamic content 【发布时间】:2015-10-15 17:19:39 【问题描述】:

我正在使用具有以下结构的 URL 字符串:

URL 
page/wa/seattle
page/ca/sandiego
page/mi/detroit

我基本上想知道是否可以将 Regex 与 case 语句结合使用来创建以下内容:

Page        State      City 
page        wa         seattle
page        ca         sandiego
page        mi         detroit

我目前编写的代码可以找出哪些页面是州页面,哪些页面是城市页面。

CASE WHEN (regexp_instr(HITSPAGEPAGEPATH::text, '^/page/[a-z]2/[a-z]+':: 
           CHARACTER VARYING::text)) 
     THEN (regexp_instr(HITSPAGEPAGEPATH::text, 
           '^/page/[a-z]2/[a-z]+'::CHARACTER VARYING::text)) 
     ELSE NULL 
END AS city 

我无法弄清楚的部分是我可以在“then”之后放置什么以仅显示城市或州。这是用于 Amazon redshift 上的 postgres sql 使用 sql 工作台,如果这有助于回答什么语法在。

【问题讨论】:

【参考方案1】:

不需要正则表达式,只需将字符串拆分为 3 个元素(以/ 分隔)并将每个元素用作一列:

select elements[1] as page, 
       elements[2] as state,
       elements[3] as city
from (
   select string_to_array(hitspagepagepath, '/') as elements
   from the_table
) t
order by page;

【讨论】:

我收到一条错误消息,提示“t 中不存在列“元素” 感谢您指出不需要正则表达式,但我提出的建议是否可行? @camacnei:抱歉,忘记了列别名。 哎呀,现在出现了另一个错误。 Redshift 不支持“string_to_array” :( 感谢您的帮助!【参考方案2】:
    select hitspagepagepath, split_part(hitspagepagepath,'/',2) as root_url,
                     split_part(hitspagepagepath,'/',3) as State,
                     split_part(hitspagepagepath,'/',4) as City
    from Table

【讨论】:

以上是关于在 case 语句中使用正则表达式提取动态内容的主要内容,如果未能解决你的问题,请参考以下文章

求一正则表达式,能匹配镜像字符串

在 redshift 中使用正则表达式和 casestatements 语句

如何在sql语句中使用正则表达式

jmeter之上下文传递(正则表达式)

C# 正则提取sql语句字符串里的字段名

c#使用正则表达式提取内容