Google BigQuery 检查一个数组是否是另一个数组的超集/子集

Ren*_*ong 2 sql google-bigquery

给定 Google BigQuery 中的两个数组,我需要确定一个数组中的所有元素是否都包含在另一个数组中。

例如,我正在尝试完成以下查询:

WITH
  ArrayA AS (
  SELECT
    [1, 2, 3] arrA,
  UNION ALL
  SELECT
    [4, 5, 6])
  ArrayB AS (
  SELECT
    [1, 2, 3, 4, 5] arrB)
SELECT
  *
FROM
  ArrayA
CROSS JOIN
  ArrayB
WHERE
  <your code goes here>
Run Code Online (Sandbox Code Playgroud)

结果看起来像

arrA    | arrB
[1,2,3] | [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

,因为 [1,2,3,4,5] 是 [1,2,3] 的超集,但不是 [4,5,6] 的超集。

提前谢谢了。

Sab*_*Sab 5

您可以检查 arrA 中的每个项目,然后获取最少的项目。如果 arrA 的所有项都在 arrB 中,则将有 3 trues,因此最小值为 true。如果其中至少有一个不在 arrB 中,则将有 2true和 1 false,因此最小值为假。

WITH
ArrayA AS (
    SELECT [1, 2, 3] arrA,
    UNION ALL
    SELECT [4, 5, 6]
),
ArrayB AS (
  SELECT [1, 2, 3, 4, 5] arrB
)
SELECT
  *, 
  (
    SELECT min(a in UNNEST(arrB))
    FROM UNNEST(arrA) as a
  ) as is_a_in_b
FROM ArrayA
CROSS JOIN ArrayB
Run Code Online (Sandbox Code Playgroud)

你也可以让它成为一个函数,并在很多地方使用它。抱歉命名不好:)

CREATE TEMP FUNCTION is_array_in_array(subset ARRAY<int64>, main ARRAY<int64>) AS ((SELECT min(a in UNNEST(main)) FROM UNNEST(subset) as a));

WITH
ArrayA AS (
    SELECT [1, 2, 3] arrA,
    UNION ALL
    SELECT [4, 5, 6]
),
ArrayB AS (
  SELECT [1, 2, 3, 4, 5] arrB
)
SELECT
  *, 
  is_array_in_array(arrA, arrB) as is_a_in_b
FROM ArrayA
CROSS JOIN ArrayB
Run Code Online (Sandbox Code Playgroud)