雪花。如何检查子数组是否出现在另一个数组中?

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。