雪花。如何检查子数组是否出现在另一个数组中?
Snowflake. How to check if the sub-array is presented in another array?
我想检查一个数组中的所有项目是否都出现在另一个数组中。
我一直在浏览 Snowflake 文档,但找不到任何好的方法。
例如在 PostgreSQL 中,它很容易通过 <@
(即 ARRAY[2,7] <@ ARRAY[1,7,4,2,6]
)来解决。
关于如何在没有丑陋黑客的情况下优雅地解决它的任何想法?谢谢!
ARRAY_INTERSECTION
和大小的逻辑可以用 UDF 包装:
CREATE FUNCTION is_array_subarray (arr1 ARRAY, arr2 ARRAY)
RETURNS BOOLEAN
AS 'ARRAY_SIZE(ARRAY_INTERSECTION(arr1,arr2)) = ARRAY_SIZE(arr1)';
查询:
SELECT a1, a2, is_array_subarray (a1, a2) AS res
FROM (SELECT ARRAY_CONSTRUCT(2,7), ARRAY_CONSTRUCT(1,7,4,2,6)
UNION
SELECT ARRAY_CONSTRUCT(2,7,2), ARRAY_CONSTRUCT(1,7,4,2,6)
) AS s(a1, a2);
输出:
(*) non-unique 元素的处理可能需要根据需要进行细化。这里需要全匹配
Lukasz Szozda 的回答的一个小补充。最好按原样使用 ARRAY_SIZE(ARRAY_INTERSECTION(arr1,arr2)) = ARRAY_SIZE(arr1)
,而不使用 UDF,因为它会对性能产生真正的影响。
我正在玩弄 2 个相等的查询,但后者是使用 UDF。执行时间差异为 40 毫秒和 2 秒。
我决定不使用 UDF。
我想检查一个数组中的所有项目是否都出现在另一个数组中。
我一直在浏览 Snowflake 文档,但找不到任何好的方法。
例如在 PostgreSQL 中,它很容易通过 <@
(即 ARRAY[2,7] <@ ARRAY[1,7,4,2,6]
)来解决。
关于如何在没有丑陋黑客的情况下优雅地解决它的任何想法?谢谢!
ARRAY_INTERSECTION
和大小的逻辑可以用 UDF 包装:
CREATE FUNCTION is_array_subarray (arr1 ARRAY, arr2 ARRAY)
RETURNS BOOLEAN
AS 'ARRAY_SIZE(ARRAY_INTERSECTION(arr1,arr2)) = ARRAY_SIZE(arr1)';
查询:
SELECT a1, a2, is_array_subarray (a1, a2) AS res
FROM (SELECT ARRAY_CONSTRUCT(2,7), ARRAY_CONSTRUCT(1,7,4,2,6)
UNION
SELECT ARRAY_CONSTRUCT(2,7,2), ARRAY_CONSTRUCT(1,7,4,2,6)
) AS s(a1, a2);
输出:
(*) non-unique 元素的处理可能需要根据需要进行细化。这里需要全匹配
Lukasz Szozda 的回答的一个小补充。最好按原样使用 ARRAY_SIZE(ARRAY_INTERSECTION(arr1,arr2)) = ARRAY_SIZE(arr1)
,而不使用 UDF,因为它会对性能产生真正的影响。
我正在玩弄 2 个相等的查询,但后者是使用 UDF。执行时间差异为 40 毫秒和 2 秒。
我决定不使用 UDF。