Impala find_in_set 用百分号匹配 LIKE
Posted
技术标签:
【中文标题】Impala find_in_set 用百分号匹配 LIKE【英文标题】:Impala find_in_set to match LIKE with percentage sign 【发布时间】:2018-07-09 21:31:17 【问题描述】:有没有办法在find_in_set
中匹配zz-10%
?
例如:
select find_in_set('zz-1000','zz-10%,zz-2000,zz-3000');
这应该返回 1
但 Impala 不支持它。
我想知道 Regex 是否有一些技巧可以解决? find_in_set
似乎只做完全匹配。
理想情况下,这应该只返回 1
,因为我想避免硬编码一堆 zz-10%
变体。
这是来自https://www.cloudera.com/documentation/enterprise/5-14-x/topics/impala_string_functions.html的这个函数的定义
find_in_set(string str, string strList)
用途:返回位置 (从 1 开始)内指定字符串的第一次出现 逗号分隔的字符串。如果任一参数为 NULL,则返回 NULL,0 如果未找到搜索字符串,如果搜索字符串包含,则为 0 一个逗号。返回类型:int
我无法更改zz-1000
(第一个参数),因为它基本上是一个列。如果有办法的话,我可以做一堆 IF / CASE WHEN。
谢谢。
更新 1
我试过了:
select find_in_set('zz-1000','zz-10\d+,zz-2000,zz-3000');
得到了这个:
+----------------------------------------------------+
| find_in_set('zz-1000', 'zz-10\d+,zz-2000,zz-3000') |
+----------------------------------------------------+
| 0 |
+----------------------------------------------------+
所以这也行不通。
【问题讨论】:
我不熟悉黑斑羚。%
只是通配符吗?如果是这样,您可以使用 zz-10\d+
表示 zz-10 后跟一个或多个数字字符。
它似乎不起作用。我发布了 UPDATE 1。
那是因为你把它们弄混了。试试find_in_set('zz-10\d+', 'zz-1000,zz-200,zz-3000')
这只有在 find_in_set 支持正则表达式模式时才有效......
从我在网上看到的情况来看,它看起来不受支持。 Maybe this question can help you
这也不起作用:(我正在考虑通过在第二个参数中搜索 %
字符并手动删除它。然后“剪切”搜索字符串的长度?!
【参考方案1】:
REGEXP_LIKE
函数怎么用:
+----------------------------------------------+
| regexp_like('zz-1000', 'zz-10\\d+$|zz-2000') |
+----------------------------------------------+
| true |
+----------------------------------------------+
当你有一个静态数量的字符串要比较时,我们可以试试这个:
SELECT CASE
WHEN regexp_like('zz-1000', 'zz-10\\d+$') THEN 1
WHEN regexp_like('zz-1000', 'zz-2000') THEN 2
ELSE 0
END;
【讨论】:
当然可以,但是我怎样才能给我指数回报呢? @HP 我用 CASE 表达式的解决方案更新了答案。希望,它会为你工作。 这可能行得通,但此列表中的项目数量'zz-10%,zz-2000,zz-3000'
可能会达到一百......
在 Impala 中,我想知道是否有办法将逗号分隔的字符串拆分为行并在每一行上执行 regexp_like?那么这将比使用find_in_set
更容易以上是关于Impala find_in_set 用百分号匹配 LIKE的主要内容,如果未能解决你的问题,请参考以下文章