雪花识别ARRAY_CONTAINS部分匹配

时间:2020-05-13 08:06:23

标签: snowflake-cloud-data-platform

我正在寻找部分匹配项,或者使用某种通配符在SNOWFLAKE数组中进行字符串匹配。

SELECT ARRAY_CONTAINS('HELLO'::VARIANT, ARRAY_CONSTRUCT('HELLO', 'HI'))   
<TRUE>

尝试过,但没有运气

SELECT ARRAY_CONTAINS('HELL%'::VARIANT, ARRAY_CONSTRUCT('HELLO', 'HI'))
<FALSE>

还有其他方法吗?

3 个答案:

答案 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.