2017-07-18 105 views
0

模式BigQuery中 领域:项目 类型:字符串如何在bigquery中查询数组?

价值在项目现场表存储为字符串 {"data": [{"id": "1234", "plan": {"sub_id": "567", "metadata": {"currentlySelling": "true", "custom_attributes": "{\"shipping\": true,\"productLimit\":10}", "Features": "[\"10 products\", \"Online support\"]"}, "name": "Personal", "object": "plan"}, "quantity": 1}], "has_more": false}

两个问题1)我怎样才能查询阵列如中:其中运费为真或其中一个功能是“在线支持”2)我必须将数据作为字符串存储的原因,因为“custom_attributes”值可能会更改。有一种更好的方法可以在bigquery中存储数据,当其中一个嵌套键的值可以更改时?

+0

你应该澄清你的表的实际模式!另外 - 你到目前为止尝试过什么?请修改您的问题以显示您遇到问题的代码的[最小化,完整和可验证示例](http://stackoverflow.com/help/mcve),然后我们可以尝试帮助解决特定问题。你也可以阅读[如何问](http://stackoverflow.com/help/how-to-ask)。 –

回答

2

您的查询会是这样的:

#standardSQL 
SELECT game 
FROM YourTable 
WHERE EXISTS (SELECT 1 FROM UNNEST(participant) WHERE name = 'sam'); 

这将返回所有的比赛里'sam'是一个参与者。这里是一个自包含的例子:

#standardSQL 
WITH YourTable AS (
    SELECT 'A' AS game, ARRAY<STRUCT<name STRING, age INT64>>[('sam', 12), ('tony', 12), ('julia', 12)] AS participant UNION ALL 
    SELECT 'B', ARRAY<STRUCT<name STRING, age INT64>>[('sam', 12), ('max', 12), ('jacob', 12)] UNION ALL 
    SELECT 'C', ARRAY<STRUCT<name STRING, age INT64>>[('sam', 12), ('max', 12), ('julia', 12)] 
) 
SELECT game 
FROM YourTable 
WHERE EXISTS (SELECT 1 FROM UNNEST(participant) WHERE name = 'sam'); 

如果你想透视数据,以对每个参与者一栏,你可以使用这样的查询:

#standardSQL 
CREATE TEMP FUNCTION WasParticipant(
    p_name STRING, participant ARRAY<STRUCT<name STRING, age INT64>>) AS (
    EXISTS(SELECT 1 FROM UNNEST(participant) WHERE name = p_name) 
); 

WITH YourTable AS (
    SELECT 'A' AS game, ARRAY<STRUCT<name STRING, age INT64>>[('sam', 12), ('tony', 12), ('julia', 12)] AS participant UNION ALL 
    SELECT 'B', ARRAY<STRUCT<name STRING, age INT64>>[('sam', 12), ('max', 12), ('jacob', 12)] UNION ALL 
    SELECT 'C', ARRAY<STRUCT<name STRING, age INT64>>[('sam', 12), ('max', 12), ('julia', 12)] 
) 
SELECT 
    ARRAY_AGG(IF(WasParticipant('sam', participant), game, NULL) IGNORE NULLS) AS sams_games, 
    ARRAY_AGG(IF(WasParticipant('tony', participant), game, NULL) IGNORE NULLS) AS tonys_games, 
    ARRAY_AGG(IF(WasParticipant('julia', participant), game, NULL) IGNORE NULLS) AS julias_games, 
    ARRAY_AGG(IF(WasParticipant('max', participant), game, NULL) IGNORE NULLS) AS maxs_games 
FROM YourTable; 

这将返回数组为每个参与者玩游戏。

+0

数据以字符串形式存储。如果数据以重复的方式存储,上述内容将起作用。 '错误:在UNNEST中引用的值必须是数组。 UNNEST在[2:36]' –

+0

包含STRING类型的表达式所以'participant'是一个看起来像''[{“name”:“sam”,“age”:12},{“name”:“tony “,”年龄“:12},{”姓名“:”茱莉亚“,”年龄“:12}]?让表模式匹配数据并为'participant'使用REPEATED RECORD字段会更好。 –

+0

我真的会建议注意我对问题本身的评论! - 这将为我们所有人节省时间:o) –