根据值之间的任何值提取字段

时间:2017-11-28 17:21:27

标签: sql regex hive hiveql

我有一个名为pagename的字段,它采用以下形式:

tools|tools|tool|envestnet|results
tools|tools|tool|envestnet|inputs
tools|tools|tool|nikko|inputs
tools|tools|tool|nikko|results

tools|tools|tool name|ubs|results
tools|tools|tool name|ubs|inputs
tools|tools|tool name|iretire decum|results
tools|tools|tool name|iretire decum|inputs

依旧......

我需要根据以下条款运行某个查询:

case when pagename like 'tools|tools|tool name%' then 'Tool Name'
when pagename like 'tools|tools|tool|%' then 'Tool'
else '' end page_name

然而,这对我不起作用,因为它会在记录中产生重复,因为|输入和|结果通常具有相同的值。

我如何根据以下内容进行案例陈述:

case when pagename like 'tools|tools|tool name|*|inputs' then 'Tool Name Inputs'
when pagename like 'tools|tools|tool|*|inputs' then 'Tool Inputs'
when pagename like 'tools|tools|tool name|*|results' then 'Tool Name Results'
when pagename like 'tools|tools|tool|*|results' then 'Tool Results'
else '' end page_name

哪里*可以是什么?

提前谢谢你。这是一个Hive问题,但我确信SQL解决方案在这里也适用。

1 个答案:

答案 0 :(得分:1)

使用正则表达式rlike代替like|应该被\\屏蔽,因为它在regexp中具有特殊含义。 ^ - 表示字符串的开头,$ - 字符串的结尾。而.*?就是一切:

case when pagename rlike '^tools\\|tools\\|tool name\\|.*?\\|inputs$' then 'Tool Name Inputs'
     when pagename rlike '^tools\\|tools\\|tool\\|.*?\\|inputs$' then 'Tool Inputs'
     when pagename rlike '^tools\\|tools\\|tool name\\|.*?\\|results$' then 'Tool Name Results'
     when pagename rlike '^tools\\|tools\\|tool\\|.*?\\|results$' then 'Tool Results'
else '' end page_name