2017-05-12 29 views
0

我有這樣一個查詢,在標準SQL的BigQuery - 上查詢數據集的模式可選字段

SELECT record.field1, record.field2 
FROM dataset.* 
WHERE record.field2 == 'something' 

,但我的一些表不會對這種模式field2

我真的收到這個錯誤:

Field name field2 does not exist in STRUCT field at ... [17:34]

任何人都知道我怎樣才能查詢放一些可選子句時,場中模式的存在是爲了評估僅

+2

1)如果你期望這發生在純粹的BQ SQL中 - 這是不可行的,因此您可以使用[BigQuery問題跟蹤器](http://code.google.com/p/google-bigquery/)發佈功能請求2)同時您可以編寫簡單的代碼在您選擇的客戶端中讀取數據集中表的模式,並採取一致行動(但看起來不是您想要的 - 請參閱上一個項目符號)3)btw - '=='在BQ SQL中不適用 - >你應該使用'='; –

+0

是的......我正在構建這個查詢來計算一些常規指標,因此使用API​​編寫一些代碼不是我的第一選擇。如果沒有FR,我會打開一個。謝謝,米哈伊爾! –

+2

我認爲有潛在的相關FR可以幫助您的方案 - 有能力將通用對象傳遞到UDF(模板) - 您可以嘗試在問題跟蹤器中搜索它。如果我沒有錯 - 它是由@ElliottBrossard前段時間基於SO –

回答

0

我唯一的解決方法是將STRUCTrecord到字符串,然後轉換重新分析,即下面的查詢說明的方法:

with 
t1 as (select 'foo' field1, 'a' field2), 
t2 as (select 'bar' field1) 
select 
    trim(split(f)[safe_offset(0)], '()') field1, 
    trim(split(f)[safe_offset(1)], '()') field2 
from 
(select format("%t", t1) f from t1 union all 
select format("%t", t2) f from t2) 

它產生:

Row field1 field2 
1 bar  null  
2 foo  a 

若要將此解決方案到原來的問題:

SELECT 
    trim(split(f)[safe_offset(0)], '()') field1, 
    trim(split(f)[safe_offset(1)], '()') field2 
FROM (
    select format("%t", t) f from `dataset.*` t 
) 
WHERE record.field2 == 'something' 
+0

但整個技巧/問題是在如何實際做這種轉換'給所有數據集的表作爲廣告的一部分-hoc? :o) –

+0

你能澄清你的意思嗎? –

+0

我只是想知道 - 如何在原始問題中將這種方法實際應用於特定用例? –

相關問題