【问题标题】:How do I find elements in an array in BigQuery如何在 BigQuery 的数组中查找元素
【发布时间】:2017-08-16 19:50:10
【问题描述】:

我正在尝试在数组中搜索具有某些键值对的行。我的 BigQuery 表中的一行看起来像这样。

{
  "ip": "192.168.1.1",
  "cookie" [
    {
      "key": "apple",
      "value: "red"
    },
    {
      "key": "orange",
      "value: "orange"
    },
    {
      "key": "grape",
      "value: "purple"
    }
  ]
}

我曾想过像下面这样使用隐式 UNNEST 或 CROSS JOIN,但它不起作用,因为取消嵌套只会创建多个不同的行。

SELECT ip
FROM table t, t.cookie c
WHERE (c.key = "grape" AND c.value ="purple") AND (c.key = "orange" AND c.value ="orange")

This link 非常接近我想要做的,除了他们使用legacy SQL 而不是standardSQL

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:
    #standardSQL
    SELECT ip
    FROM yourTable 
    WHERE (
      SELECT COUNT(1) 
      FROM UNNEST(cookie) AS pair 
      WHERE pair IN (('grape', 'purple'),  ('orange', 'orange'))
    ) >= 2
    

    您可以使用以下虚拟数据对其进行测试

    #standardSQL
    WITH yourTable AS (
      SELECT '192.168.1.1' AS ip, [('apple', 'red'), ('orange', 'orange'), ('grape', 'purple')] AS cookie UNION ALL
      SELECT '192.168.1.2', [('abc', 'xyz')]
    )
    SELECT ip
    FROM yourTable 
    WHERE (
      SELECT COUNT(1) 
      FROM UNNEST(cookie) AS pair 
      WHERE pair IN (('grape', 'purple'),  ('orange', 'orange'))
    ) >= 2
    

    如果您需要输出 ip,如果至少一对在数组中 - 您需要在 WHERE 子句中将 >= 2 更改为 >=1

    【讨论】:

    • 工作就像一个魅力,谢谢。我不知道你也可以在 WHERE 条件下编写子查询
    • @dorachan2010 - 是的,但请注意 - Correlated subqueries that reference other tables are not supported unless they can be de-correlated, such as by transforming them into an efficient JOIN 您可以查看 stackoverflow.com/a/43006968/5221944 以了解相关查询如何转换为连接以避免错误消息
    • 是的,对于 SQL 和 BigQuery SQL,我仍在努力理解这一点......每个语句中的引用范围......
    • @dorachan2010 - 当然。在我上面引用的帖子中-您可以看到已解决的final 解决方案-但您可以单击edited NN hours ago 链接以查看我的初始答案,该答案与相关子查询完全有问题。这对你来说是一个很好的例子。也给它投票 - 如果它可以帮助您更好地学习/理解这个主题
    【解决方案2】:

    如果保证cookie 数组中没有重复对,Mikhail 的解决方案就很好。但如果可能有重复,这里是替代解决方案:

    #standardSQL
    WITH yourTable AS (
      SELECT 
        '192.168.1.1' AS ip,
        [('apple', 'red'), ('orange', 'orange'), ('grape', 'purple')] AS cookie UNION ALL
      SELECT
        '192.168.1.2',
        [('abc', 'xyz'), ('orange', 'orange'), ('orange', 'orange')]
    )
    SELECT ip
    FROM yourTable t
    WHERE (
      ('grape', 'purple')  IN UNNEST(t.cookie) AND
      ('orange', 'orange') IN UNNEST(t.cookie) )
    

    只有结果

    ip
    -----------
    192.168.1.1
    

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 1970-01-01
      • 2021-12-31
      • 2020-08-21
      • 1970-01-01
      • 2011-11-13
      • 2016-07-02
      • 2015-08-22
      • 1970-01-01
      相关资源
      最近更新 更多