2017-07-18 70 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) –