2017-05-12 9 views
0

データセットのスキーマにオプションフィールドを照会します。BigQueryの私は<strong>標準SQL</strong>に、このようなクエリがある

そのエラーを取得I`m:

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)を使用して機能リクエストを投稿できるので、簡単なコードを書くことができますあなたのデータセット内のテーブルのスキーマを読んで、それに応じて動作するようにしてください(前のbulletを参照してください)3)btw - '=='はBQ SQLでは適切ではありません - > '='を使うべきです。 –

+0

はい...一般的なメトリックを計算するためにこのクエリをアドホックに構築しています。そのため、APIを使用していくつかのコードを書くことは、私の最初の選択肢ではありませんでした。もしこれについてFRがなければ、私はそれを開きます。ありがとう、ミハイル! –

+2

私はあなたのシナリオに役立つ潜在的に関連したFRがあると思います - 一般的なオブジェクトをUDF(テンプレート)に渡す機能を持っている - あなたはそれを問題トラッカーで検索しようとすることができます。もし私が誤解されていないなら、それはもうちょっと前に@ElliottBrossardによって提出されました。 –

答えて

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

私はちょうど疑問に思いました - 元の質問の特定のユースケースにこのアプローチを実際に適用する方法は? –

関連する問題