2017-07-18 14 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)どのように私は、例えば、アレイ内問い合わせることができます保存されます。出荷が真ですか機能の1つが「オンラインサポート」2)「custom_attributes」の値が変更される可能性があるため、データを文字列として保存する必要があった理由。入れ子にされたキーの値が変わるときに、bigqueryにデータを格納する良い方法はありますか?

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

これは'sam'が参加したゲームのすべてを返します。

+0

テーブルの実際のスキーマを明確にする必要があります。また - これまでに何を試しましたか?問題を抱えているコードの[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)を表示するように質問を編集し、特定の問題を解決することができます。 [How to Ask](http://stackoverflow.com/help/how-to-ask)も読むことができます。 –

答えて

2

あなたのクエリは、このようなものになるだろう。ここで自己完結型の例である:

#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]でのSTRING型の表現が含まれています。 ' –

+0

'participant'は' [{"name": "sam"、 "age":12}、{"name": "tony "、" age ":12}、{" name ":" julia "、" age ":12}]'?テーブルスキーマをデータにマッチさせ、 'participant'にREPEATED RECORDフィールドを使用する方が良いでしょう。 –

+0

私は本当に質問自体のための私のコメントに注意を払うことをお勧めします!! - これは私たち全員の時間を節約するでしょう:o) –

関連する問題