【问题标题】:How to convert a nested flatten into Standard SQL如何将嵌套展平转换为标准 SQL
【发布时间】:2017-12-15 21:58:39
【问题描述】:

目前使用来自 google 的 BigQuery。我的旧查询如下所示:

Select * FROM FLATTEN(FLATTEN([DB.table1], record.atr), record.atr.value) 
WHERE record.atr.value IN "1"

我了解BigQuery now automatically flattens 表,所以我认为这可以解决问题:

SELECT * FROM `DB.table1`
WHERE record.atr.value IN "1" 

但是我收到一个错误错误:无法访问类型为 ARRAY、sv ARRAY、...>> 在 [2:17] 的值的字段值

如何将其转换为标准 SQL 查询?

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    如何将其转换为标准 SQL 查询?
    选择 * FROM `DB.table1`
    WHERE record.atr.value IN "1"

    以下是 BigQuery 标准 SQL

    #standardSQL
    SELECT *
    FROM `DB.table1`
    WHERE (SELECT COUNT(1) 
            FROM UNNEST(record.atr) AS atr, 
                  UNNEST(atr.value) AS val 
            WHERE val IN ('1')) > 0  
    

    您可以使用虚拟数据(部分借鉴 Elliott 的示例)对其进行测试

    #standardSQL
    WITH `DB.table1` AS (
      SELECT 1 AS id, STRUCT([STRUCT<x STRING, value ARRAY<STRING>>('foo', ['1', '2']), ('bar', ['3', '4', '5'])] AS atr) AS record UNION ALL
      SELECT 2, STRUCT([STRUCT<x STRING, value ARRAY<STRING>>('baz', ['6', '7'])])
    )
    SELECT *
    FROM `DB.table1`
    WHERE (SELECT COUNT(1) 
            FROM UNNEST(record.atr) AS atr, 
                  UNNEST(atr.value) AS val 
            WHERE val IN ('1')) > 0
    

    【讨论】:

      【解决方案2】:

      BigQuery 在使用标准 SQL 时不会自动展平数组;您提供的链接表明相反。在您的情况下,查询将是这样的:

      #standardSQL
      SELECT * EXCEPT(value), value
      FROM `Db.table1`
      CROSS JOIN UNNEST(record.atr) AS atr
      CROSS JOIN UNNEST(atr.value) AS value;
      

      如果您想为空数组获取一行,您可以改用LEFT JOIN

      #standardSQL
      SELECT * EXCEPT(value), value
      FROM `Db.table1`
      LEFT JOIN UNNEST(record.atr) AS atr
      LEFT JOIN UNNEST(atr.value) AS value;
      

      这是一个您可以尝试运行的示例查询:

      #standardSQL
      WITH Input AS (
        SELECT STRUCT(ARRAY<STRUCT<x STRING, value ARRAY<INT64>>>[('foo', [1, 2]), ('bar', [3, 4, 5])] AS atr) AS record UNION ALL
        SELECT STRUCT(ARRAY<STRUCT<x STRING, value ARRAY<INT64>>>[('baz', [6, 7])])
      )
      SELECT * EXCEPT (value)
      FROM Input
      CROSS JOIN UNNEST(record.atr) AS atr
      CROSS JOIN UNNEST(atr.value) AS value;
      

      【讨论】:

      • 感谢您的回复。现在我明白了,它会展平表格,但不会自动展平数组。我试试看。
      • 好的,新错误:“SELECT * EXCEPT 列表中的列 atr 在 [1:18] 不存在”
      • 尝试只使用SELECT *而不使用EXCEPT (atr)
      • 查询语法正确但失败:错误:不支持结果中的重复列名。找到重复项:值
      • 我需要将value 放入EXCEPT 列表中...我更新了答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 2015-12-15
      • 2018-04-09
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多