【问题标题】:How to safely unnest SQL array elements to columns?如何安全地将 SQL 数组元素取消嵌套到列?
【发布时间】:2020-11-07 01:23:33
【问题描述】:

我想了解如何在标准 SQL (BigQuery) 中将数组安全地取消嵌套到列中,即将列表中的每个项目转换为列。

考虑:

WITH shoppingList AS (
    SELECT 'Bob' AS name, ['bananas', 'olives', 'ham'] AS list
    UNION ALL
    SELECT 'Anna', ['toothpaste', 'shampoo']
)

然后我可以轻松查询:

SELECT name, list[OFFSET(0)] as item1, list[OFFSET(1)] AS item2 
FROM shoppingList

但是,当我希望查询 item3itemN 时,事情会变得更加复杂。

由于SQL数组元素访问不是函数,我不能使用SAFE.前缀,如果我查询SELECT list[OFFSET(2)] as item3 FROM shoppingList,那么SQL就会报错。有没有办法实现 SAFE 等效项并在找不到项目时返回 NULL?

【问题讨论】:

    标签: sql arrays error-handling google-bigquery


    【解决方案1】:

    关于第一点,BigQuery 有一个专门为此场景创建的“安全”函数SAFE_OFFSET。您的“测试”查询将是

    WITH shoppingList AS (
        SELECT 'Bob' AS name, ['bananas', 'olives', 'ham'] AS list
        UNION ALL
        SELECT 'Anna', ['toothpaste', 'shampoo']
    )
    
    SELECT name, list[SAFE_OFFSET(0)] as item1, list[SAFE_OFFSET(1)] AS item2 , list[SAFE_OFFSET(2)] as item3
    FROM shoppingList
    

    【讨论】:

    • 谢谢。我在使用数组文档cloud.google.com/bigquery/docs/reference/standard-sql/… 中看不到它,所以这只适用于已知的最大数组长度,回答点 1。好! :)
    • @Benjamin 。 . .这回答了您提出的问题,应该被接受。
    • @GordonLinoff 当然。完毕。当两个问题捆绑在一起时,政策是什么?我真的应该提出一个新问题吗?
    • @Benjamin 。 . .在几乎所有情况下,是的。在某些情况下,“多个问题”实际上是同一问题的不同方面。例如,如果您的问题是“如何从数组中创建三列?如何给它们每个特定的名称?”。但是safe_offset() 是如何无错误访问数组的答案。可变数量的列是完全不同的。
    猜你喜欢
    • 2016-02-11
    • 2018-05-24
    • 2021-12-11
    • 2015-05-08
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    相关资源
    最近更新 更多