を参照してください、あなたは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"、 "値":
スキーマは、 "クエリ" が「 "" foo "、" param "]、[query_values]:[" bar "、" val "] 私があなたが指している文書が表示されませんでした。レガシーからマイグレーションするのではなく、スタンダードで新鮮なものを始めようと考えています。 –
2つの列が別々に繰り返される別のサンプルクエリを追加しました。私は既存のドキュメントにこのような例があるのかどうか分かりませんが、それを追加すると便利かもしれません(ドキュメントライターにフォローアップします)。ありがとう! –
うわー、このようなオフセットを使うことができたことはわかりませんでした。 OFFSETドキュメントに追加する必要があります。また、「レガシーから標準SQLへの移行」のドキュメントは、移行されていないユーザーにとって有益な情報が含まれているため、別の名前に変更するか、再作成する必要があります。 –