【问题标题】:BigQuery Arrays - check if Array contains specific valuesBigQuery Arrays - 检查 Array 是否包含特定值
【发布时间】:2021-04-30 05:29:38
【问题描述】:

我正在尝试查看 BigQuery 数组中是否存在特定的一组项目。

以下查询有效(检查数组中是否存在 1 项):

WITH sequences AS
(
    SELECT 1 AS id, [10,20,30,40] AS some_numbers
        UNION ALL 
    SELECT 2 AS id, [20,30,40,50] AS some_numbers
        UNION ALL 
    SELECT 3 AS id, [40,50,60,70] AS some_numbers
)
SELECT id, some_numbers 
FROM sequences 
WHERE 20 IN UNNEST(some_numbers)

下面是我无法做的(检查数组中是否存在超过 1 个项目):

(此查询错误)

WITH sequences AS
(
    SELECT 1 AS id, [10,20,30,40] AS some_numbers
        UNION ALL 
    SELECT 2 AS id, [20,30,40,50] AS some_numbers
        UNION ALL 
    SELECT 3 AS id, [40,50,60,70] AS some_numbers
)
SELECT id, some_numbers 
FROM sequences 
WHERE (20,30) IN UNNEST(some_numbers)

我设法找到了以下解决方法,但我觉得有更好的方法来做到这一点:
WITH sequences AS
(
    SELECT 1 AS id, [10,20,30,40] AS some_numbers
        UNION ALL 
    SELECT 2 AS id, [20,30,40,50] AS some_numbers
        UNION ALL 
    SELECT 3 AS id, [40,50,60,70] AS some_numbers
)

SELECT id, some_numbers  
FROM  sequences
WHERE (
    
    ( 
        SELECT COUNT(1)
        FROM UNNEST(some_numbers) s
        WHERE s in (20,30)
    ) > 1
)

欢迎提出任何建议。

【问题讨论】:

  • 您是在寻找两个值都在数组中还是在任何数组中?

标签: google-cloud-platform google-bigquery


【解决方案1】:

假设您正在查找匹配数组 [20, 30] 中的所有元素都在目标数组 (some_numbers) 中找到的行。还假设(匹配和目标)数组中没有重复的数字

select id, some_numbers
from sequences a,
unnest([struct([20, 30] as match)]) b
where (
  select count(1) = array_length(match) 
  from a.some_numbers num
  join b.match num
  using(num)
)

【讨论】:

    【解决方案2】:

    没什么好建议的...Official docs建议使用exists

    WHERE EXISTS (SELECT *
                  FROM UNNEST(some_numbers) AS s
                  WHERE s in (20,30));
    

    【讨论】:

    • 谢谢。但我需要的是看看some_numbers数组中是否存在两个元素20,30
    猜你喜欢
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 2020-05-24
    • 2018-02-13
    • 2016-11-19
    • 2015-05-15
    • 2015-06-24
    • 2019-07-04
    相关资源
    最近更新 更多