【发布时间】:2021-10-15 06:54:10
【问题描述】:
Postgresql 具有用于从数组中删除元素的 ARRAY_REMOVE 函数。我如何在 Snowflake 中做到这一点?
【问题讨论】:
标签: javascript sql snowflake-cloud-data-platform user-defined-functions
Postgresql 具有用于从数组中删除元素的 ARRAY_REMOVE 函数。我如何在 Snowflake 中做到这一点?
【问题讨论】:
标签: javascript sql snowflake-cloud-data-platform user-defined-functions
UDF 方法效果很好,如果您愿意,可以使用另一种方法:
取决于用例...如果您不太可能从缓存中受益并且想要“更干净”的代码,那么 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);
【讨论】:
您可以创建一个 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]'))。