2016-12-06 126 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中的元素的叉積。這相當於使用JOINCROSS JOIN代替逗號。

該查詢還使用EXCEPT (queries)來避免在查詢結果中選擇原始數組,因爲我們只希望數組的「展平」內容。

編輯:另一個示例查詢,此時其中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_params偏移索引到並聯query_values

+0

你的模式是 「查詢」: { 「參數」: 「富」, 「值」: 「酒吧」 }, { 「參數」: 「參數」, 「值」:「 val「 } ], Mine is」query_params「:[」foo「,」param「],」query_values「:[」bar「,」val「] 我沒有看到您指向的文檔,我不是從傳統中遷移,而是從標準上開始新鮮,我會看看。 –

+0

我添加了另一個示例查詢,其中兩列獨立重複。我不知道我們在現有的文檔中有這樣的例子,但添加一個可能會有用(我會跟隨我們的文檔編寫者)。謝謝! –

+1

哇,我不知道你可以使用像這樣的偏移量,太棒了!應該添加到OFFSET文檔。而且我也認爲「從傳統SQL遷移到標準SQL」中的文檔應該重新命名爲其他內容或重新編寫,因爲它包含了非遷移人員的有用信息。 –

相關問題