如何在impala regex_extract方法中使用regex OR操作并获取不同的捕获组

时间:2017-01-18 08:32:16

标签: sql regex impala

我有以下table1属性co

|-----------------------------------------
| co
|-----------------------------------------
| fsdsdf "This one" fdsfsd ghjhgj "sfdsf"
| Just This 
|-----------------------------------------

如果有引号 - 我想获得第一个出现的内容。如果没有引号,我想按原样返回内容。 对于上面的例子: 对于第一行 - This one 对于第二行 - Just This 我在Impala中有SQL代码解决了第一种情况:

select regexp_extract (co, '"([^"]*")',1) from table1

如何概括它以检测并返回下一个案例所需的结果?

3 个答案:

答案 0 :(得分:1)

你无法在黑斑羚中概括它。至于您遇到的问题需要OR |在你的正则表达式中实现。使用regex_extract,您需要将捕获组设为no。到底 。 e.g。

select regexp_extract (co, '"([^"]*")', 1 ) from table1

但是|正则表达式中的操作数,捕获组对于这两种情况都必须是不同的。您无法在regex_extract方法中定义。

如果(A) | (B)是您的正则表达式,那么您的第一个案例捕获组将是 1 ,对于您的第二个案例捕获组将 2 。但是你不能在你的regex_extract语法中加入1和2。

通用正则表达式语法将是(我认为在impala分组中不起作用):

^(?!.*")(.*)$|^[^"]*"(.*?)".*$

Watch out the capture groupings

在链接中,您会看到“This One”被捕获为第2组 只是这个被捕获为第1组

答案 1 :(得分:1)

使用union检查。

 select regexp_extract (co, '"([^"]*")',1) from table1
 union
 select co from table1 where co like '"%"'

答案 2 :(得分:1)

您可以使用if函数并将RegEx函数放在其中作为参数。所以,

if(regexp_like(co,'"'),
   regexp_extract(co,'"([^"]*)',1), co)