是否可以在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 |
+----------------------------------------------------+
所以那也不行。
答案 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;