Impala find_in_set将LIKE与百分号匹配

时间:2018-07-09 21:31:18

标签: sql regex impala

是否可以在zz-10%中匹配find_in_set

例如:

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(字符串str,字符串strList)

     

目的:返回位置   (从1开始)指定字符串中第一次出现的时间   以逗号分隔的字符串。如果任一参数为NULL,则返回NULL,0   如果找不到搜索字符串,或者为0(如果搜索字符串包含)   逗号。返回类型:int

我无法更改zz-1000(第一个参数),因为它基本上是一列。如果可以的话,我可以做一堆IF / CASE。

谢谢。

更新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                                                  |
+----------------------------------------------------+

所以那也不行。

1 个答案:

答案 0 :(得分: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;