我正在寻找部分匹配项,或者使用某种通配符在SNOWFLAKE数组中进行字符串匹配。
SELECT ARRAY_CONTAINS('HELLO'::VARIANT, ARRAY_CONSTRUCT('HELLO', 'HI'))
<TRUE>
尝试过,但没有运气
SELECT ARRAY_CONTAINS('HELL%'::VARIANT, ARRAY_CONSTRUCT('HELLO', 'HI'))
<FALSE>
还有其他方法吗?
答案 0 :(得分:0)
也许您可以(临时)将数组转换为字符串并使用CONTAINS运算符?
SELECT CONTAINS( ARRAY_TO_STRING( ARRAY_CONSTRUCT('WHY','HELLO', 'HI'),',') , 'HELL' );
答案 1 :(得分:0)
SELECT ARRAY_CONSTRUCT('HELLO', 'HI') AS aa
,':' || ARRAY_TO_STRING(aa,';') || ':' AS bb
,bb like '%:HELL%'
所以这是一个肮脏的解决方案,但它会“起作用”
答案 2 :(得分:0)
您可以使用JavaScript UDF进行此操作。本示例使用RegExp代替了like函数通配符。它已重载,因此您可以使用标准RegExp或带有参数的参数(特别是不区分大小写的参数)。这将返回一个布尔值,以近似于ARRAY_CONTAINS的行为。如果需要,可以进行简单的修改以返回值“ i”,该值将是数组中第一个匹配项的序数位置;如果它离开循环(未找到),则返回-1。
create or replace function ARRAY_CONTAINS_REGEXP(REGEXP_EXPRESSION string, A array)
returns boolean
language javascript
as
$$
var rx = new RegExp(REGEXP_EXPRESSION);
for (var i = 0; i < A.length; i++){
if (A[i].search(rx) != -1) return true;
}
return false;
$$;
create or replace function ARRAY_CONTAINS_REGEXP(REGEXP_EXPRESSION string, A array, REGEX_PARAMS string)
returns boolean
language javascript
as
$$
var rx = new RegExp(REGEXP_EXPRESSION, REGEX_PARAMS);
for (var i = 0; i < A.length; i++){
if (A[i].search(rx) != -1) return true;
}
return false;
$$;
SELECT ARRAY_CONTAINS_REGEXP('HELL.'::VARIANT, ARRAY_CONSTRUCT('HELLO', 'HI')); -- True. Wildcard match.
SELECT ARRAY_CONTAINS_REGEXP('HELL'::VARIANT, ARRAY_CONSTRUCT('HELLO', 'HI')); -- True. Partial match.
SELECT ARRAY_CONTAINS_REGEXP('\\bHEL\\b'::VARIANT, ARRAY_CONSTRUCT('HELLO', 'HI')); -- False. Full word matching.
SELECT ARRAY_CONTAINS_REGEXP('hel'::VARIANT, ARRAY_CONSTRUCT('HELLO', 'HI')); -- False. Case sensitive.
SELECT ARRAY_CONTAINS_REGEXP('HeL'::VARIANT, ARRAY_CONSTRUCT('HELLO', 'HI'), 'i'); -- True. Case insensitive partial match.
SELECT ARRAY_CONTAINS_REGEXP('\\bHeL\\b'::VARIANT, ARRAY_CONSTRUCT('HELLO', 'HI'), 'i'); -- False. Full word insensitive match.