2017-05-12 4 views
0

Ich habe eine Abfrage wie diese, in Standard-SQL:BigQuery - Abfrage optionale Felder auf Datenmenge Schemata

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

aber einige meiner Tabellen nicht auf Schema dieses field2. dass Fehler

I`m bekommen:

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

Wer weiß, wie kann ich eine optionale Klausel setzt Abfrage ausgewertet nur werden, wenn das Feld in dem Schema existiert?

+2

1) wenn Sie das erwarten in reinem BQ SQL passieren - es ist nicht machbar, also können Sie Feature-Anfragen mit dem [BigQuery-Issue-Tracker] (http://code.google.com/p/google-bigquery/) posten. 2) Sie können zwischenzeitlich einfachen Code schreiben in einem Client Ihrer Wahl, um das Schema der Tabellen in Ihrem Dataset zu lesen und entsprechend zu handeln (sieht aber so aus, als ob Sie nicht wollen - siehe vorhergehendes Bullet) 3) btw - '==' ist in BQ SQL nicht korrekt -> Sie sollten '='; –

+0

Ja ... Ich erstelle diese Abfrage Ad-hoc, um einige allgemeine Metriken zu berechnen, also war das Schreiben von Code mit der API nicht meine erste Option. Wenn es keine FR darüber gibt, werde ich eine öffnen. Danke, Mikhail! –

+2

Ich denke, es gibt potenziell verwandte FR, die in Ihrem Szenario helfen können - um die Fähigkeit zu haben, generische Objekte in UDF (Templating) zu übergeben - Sie können versuchen, im Issue Tracker danach zu suchen. Wenn ich mich nicht irre - es wurde vor einiger Zeit von @ElliottBrossard eingereicht, basierend auf einem anderen Post in SO –

Antwort

0

Die einzige Abhilfe, die ich habe, ist die STRUCTrecord auf Zeichenfolge zu konvertieren und dann reparse, dh die folgende Abfrage veranschaulicht die Vorgehensweise:

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) 

Es produziert:

Row field1 field2 
1 bar  null  
2 foo  a 

diese Lösung anwenden zu können zum ursprünglichen Problem:

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

aber der ganze Trick/Frage ist in 'wie man diese Umwandlung für alle Tabellen in gegebenem Dataset als Teil der Anzeige tatsächlich tut -Hoch? : o) –

+0

Kannst du klarstellen, was du damit meinst? –

+0

Ich habe mich nur gefragt - wie man diesen Ansatz tatsächlich auf bestimmte Anwendungsfälle in der ursprünglichen Frage anwendet? –

Verwandte Themen