您的查詢會是這樣的:
#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;
這將返回數組爲每個參與者玩遊戲。
你應該澄清你的表的實際模式!另外 - 你到目前爲止嘗試過什麼?請修改您的問題以顯示您遇到問題的代碼的[最小化,完整和可驗證示例](http://stackoverflow.com/help/mcve),然後我們可以嘗試幫助解決特定問題。你也可以閱讀[如何問](http://stackoverflow.com/help/how-to-ask)。 –