当 regexp_like 和 regexp_extract 工作正常时,Impala regexp_like 查询返回 null

Posted

技术标签:

【中文标题】当 regexp_like 和 regexp_extract 工作正常时,Impala regexp_like 查询返回 null【英文标题】:Impala regexp_like query returning null when regexp_like and regexp_extract works fine 【发布时间】:2019-08-08 22:16:40 【问题描述】:

我需要使用 regex_extract 从列中的字符串中提取数字。我在外部表上使用 Impala。

我已经检查过正则表达式,为了测试它,我还使用了 regexp_likeregexp_replace。他们俩都工作得非常完美。

这里是查询:

select 
    sucursal,
    regexp_like(sucursal,'^[0-9]1,3') as match,
    regexp_extract(sucursal,'^[0-9]1,3',1) as CodSucusal,
    regexp_replace(sucursal,'^[0-9]1,3','lala') as RepCodSucusal
from jdv.stg_devoluciones limit 5;

结果如下:

+-------------------+-------+------------+--------------------+
| sucursal          | match | codsucusal | repcodsucusal      |
+-------------------+-------+------------+--------------------+
| 124 NAVOJOA       | true  |            | lala NAVOJOA       |
| 73 BOCA DEL RIO   | true  |            | lala BOCA DEL RIO  |
| 964 JIUTEPEC      | true  |            | lala JIUTEPEC      |
| 456 TEQUISQUIAPAN | true  |            | lala TEQUISQUIAPAN |
| 212 LANDIN        | true  |            | lala LANDIN        |
+-------------------+-------+------------+--------------------+

codsucursal 应该是 sucursal 编号,但 regexp_extract 正在返回 null 而不是

预期结果:

+-------------------+-------+------------+--------------------+
| sucursal          | match | codsucusal | repcodsucusal      |
+-------------------+-------+------------+--------------------+
| 124 NAVOJOA       | true  |   124      | lala NAVOJOA       |
| 73 BOCA DEL RIO   | true  |   73       | lala BOCA DEL RIO  |
| 964 JIUTEPEC      | true  |   964      | lala JIUTEPEC      |
| 456 TEQUISQUIAPAN | true  |   456      | lala TEQUISQUIAPAN |
| 212 LANDIN        | true  |   212      | lala LANDIN        |
+-------------------+-------+------------+--------------------+

我做错了什么?

【问题讨论】:

不应该是regexp_extract(sucursal,'^[0-9]1,3', 0) as CodSucusal吗?索引必须是0 谢谢,但我已经尝试过了。在 impala 中,您需要三个参数。最后一个是正则表达式组的索引,如果匹配很多,则需要提取。 那么,你试过0吗? 天才。那工作简直太完美了!谢谢 【参考方案1】:

Impala regexp_extract function 将捕获组的索引或整个匹配的0 作为第三个参数。

regexp_extract(string subject, string pattern, int index)用途:根据正则表达式模式从字符串中返回指定的 () 组。第 0 组是指整个提取的字符串,而第 1、2 等组是指第一个、第二个等(...) 部分。

由于您的正则表达式 - ^[0-9]1,3 - 没有定义捕获组,您应该使用 0 作为第三个参数来引用整个匹配值:

regexp_extract(sucursal,'^[0-9]1,3', 0) as CodSucusal

【讨论】:

以上是关于当 regexp_like 和 regexp_extract 工作正常时,Impala regexp_like 查询返回 null的主要内容,如果未能解决你的问题,请参考以下文章

oracle regexp_like介绍和例子

用于电子邮件的 Regexp_replace 和 regexp_like

Oracle regexp_like - 只有某些字符、数字和一个符号

Oracle中REGEXP_LIKE与LIKE的区别

Oracle REGEXP_LIKE 和\A 和\Z 的含义

Oracle:to_number() 在 WHERE 子句中结合 substr() 和 regexp_like()