【问题标题】:ARRAY_REMOVE() in Snowflake?雪花中的 ARRAY_REMOVE()?
【发布时间】:2021-10-15 06:54:10
【问题描述】:

Postgresql 具有用于从数组中删除元素的 ARRAY_REMOVE 函数。我如何在 Snowflake 中做到这一点?

【问题讨论】:

    标签: javascript sql snowflake-cloud-data-platform user-defined-functions


    【解决方案1】:

    UDF 方法效果很好,如果您愿意,可以使用另一种方法:

    • 使用很棒的 snowflake caching,如果您使用 UDF 则无法使用
    • 只写简单的 SQL
    • 不保证数组的顺序

    取决于用例...如果您不太可能从缓存中受益并且想要“更干净”的代码,那么 UDF 可能是最好的 - 但是如果您可能从缓存中受益,那么可能更喜欢 SQL这种方法可能有用。

    FLATTEN the ARRAY -> Predicate data -> Return via ARRAY_AGG

    SELECT 
        ARRAY_AGG(VALUE) REMOVED
    FROM 
        CTE, LATERAL FLATTEN(AN_ARRAY) 
    WHERE 
        VALUE!='A'
    

    同样的例子也能正常工作。

        select 
            array_agg(value) 
        from 
            table(flatten(input => parse_json('["a", "b", "c", "a"]'))) 
        where 
           value not in ('a');
        select 
            array_agg(value) 
        from 
            table(flatten(input => parse_json('[4, 1, 4, 2, 3, 4]'))) 
        where 
            value not in (4);
        select 
           array_agg(value) 
        from 
           table(flatten(input => parse_json('[4.3, 1.1, 4.2, 0.1, 3.3, 0.2]'))) 
        where 
           value not in (0.2);
    

    【讨论】:

    • 这也是我的偏好,虽然你说你不能对数组进行排序,但该函数有一个 order by 选项。
    • 我将提供更多关于订购的信息@MikeWalton ...这也让我感到惊讶。我知道在极少数情况下无法保证订购 - 将通过澄清更新此答案。
    【解决方案2】:

    您可以创建一个 JS UDF。要使其适用于任何类型,您需要将要删除的值转换为变体:

    CREATE OR REPLACE FUNCTION array_remove_js(ARR variant, VAL variant)
    returns array 
    language javascript
    as '
    return ARR.filter(function(item) {
        return item !== VAL
    })
    ';
    

    使用字符串、整数和浮点数进行测试:

    select array_remove_js(parse_json('["a", "b", "c", "a"]'), 'a'::variant);
    
    select array_remove_js(parse_json('[4, 1, 4, 2, 3, 4]'), 4::variant);
    
    select array_remove_js(parse_json('[4.3, 1.1, 4.2, 0.1, 3.3, 0.2]'), 0.2::variant);
    

    【讨论】:

    • ? 我在考虑空处理,例如:select array_remove_js(parse_json('[1,2,3, null,1,2,3]'), null::variant); 但我可能会改用ARRAY_COMPACT SELECT ARRAY_COMPACT(parse_json('[1,2,3, null,1,2,3]'))
    猜你喜欢
    • 1970-01-01
    • 2020-03-03
    • 2021-02-16
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多