2016-12-06 11 views
1

私は、次の表を持っている:のBigQuery:標準SQLとフィルター繰り返しフィールド

row | query_params | query_values 
1  foo   bar 
     param   val 
2  foo   baz 

JSON:

{ 
"query_params" : [ "foo", "param"], 
"query_values" : [ "bar", "val" ] 
}, { 
"query_params" : [ "foo" ], 
"query_values" : [ "baz" ] 
} 

のようなものを私は自分の価値に繰り返されるフィールドをフィルタする標準SQLを使用して
SELECT * FROM table WHERE query_params = 'foo' 

出力するものは

row | query_params | query_values 
1  foo   bar 
2  foo   baz  

PS:レガシーSQLを使用して、同じ質問に対して、here

答えて

2

を参照してください、あなたはdifferences in filtering repeated fieldsの移行ガイドでトピックを見たことがありますか?基礎としてあなたのサンプルデータを使用して、(別々の配列であるのとは対照的に)のparamsと値が一緒に繰り返していることを仮定して、あなたのようなクエリを記述することができます。

WITH T AS (
    SELECT 1 AS row, ARRAY<STRUCT<param STRING, value STRING>>[ 
     ('foo', 'bar'), ('param', 'val')] AS queries UNION ALL 
    SELECT 2, ARRAY<STRUCT<param STRING, value STRING>>[('foo', 'baz')] 
) 
SELECT * EXCEPT (queries) 
FROM T, UNNEST(queries) 
WHERE param = 'foo'; 

ここで重要な部分はT,ですUNNEST(queries)は、Tの行とqueriesの要素の外積をとっています。これは、コンマの代わりにJOINまたはCROSS JOINを使用するのと同じです。

クエリでは、も使用されています。クエリの結果で元の配列を選択しないようにするには、配列の "平坦化された"内容のみが必要です。

編集:別のサンプルクエリ、paramsは、値が独立して繰り返し、この時間:

WITH T AS (
    SELECT 1 AS row, ['foo', 'param'] AS query_params, 
    ['bar', 'val'] AS query_values UNION ALL 
    SELECT 2, ['foo'], ['baz'] 
) 
SELECT row, query_param, query_values[OFFSET(o)] AS query_value 
FROM T, UNNEST(query_params) AS query_param WITH OFFSET o 
WHERE query_param = 'foo'; 

これは平行でquery_valuesにインデックスにquery_params内のオフセットを使用します。 【 { "PARAM": "FOO"、 "値": "バー" }、 { "PARAM": "PARAM"、 "値":

+0

スキーマは、 "クエリ" が「 "" foo "、" param "]、[query_values]:[" bar "、" val "] 私があなたが指している文書が表示されませんでした。レガシーからマイグレーションするのではなく、スタンダードで新鮮なものを始めようと考えています。 –

+0

2つの列が別々に繰り返される別のサンプルクエリを追加しました。私は既存のドキュメントにこのような例があるのか​​どうか分かりませんが、それを追加すると便利かもしれません(ドキュメントライターにフォローアップします)。ありがとう! –

+1

うわー、このようなオフセットを使うことができたことはわかりませんでした。 OFFSETドキュメントに追加する必要があります。また、「レガシーから標準SQLへの移行」のドキュメントは、移行されていないユーザーにとって有益な情報が含まれているため、別の名前に変更するか、再作成する必要があります。 –

関連する問題