So konvertieren Sie eine verschachtelte glätten in Standard-SQL

Derzeit mit BigQuery Von google. Mein legacy-Abfrage sieht wie folgt aus:

Select * FROM FLATTEN(FLATTEN([DB.table1], record.atr), record.atr.value) 
WHERE record.atr.value IN "1"

Verstehe ich BigQuery jetzt automatisch reduziert Tabellen, so dachte ich, dies würde den trick tun:

SELECT * FROM `DB.table1`
WHERE record.atr.value IN "1" 

Jedoch bekomme ich die Fehlermeldung: Fehler: kein Zugriff auf Feld-Wert auf einen Wert mit dem Typ ARRAY, sv ARRAY, …>> zu [2:17]

Wie kann ich die konvertieren dass es sich hierbei um Standard-SQL-Abfrage?

InformationsquelleAutor shockawave123 | 2017-07-11



2 Replies
  1. 2

    BigQuery nicht automatisch glätten arrays bei der Verwendung von standard-SQL; der link, den Sie zeigt das Gegenteil. In Ihrem Fall, die Abfrage wäre so etwas wie dieses:

    #standardSQL
    SELECT * EXCEPT(value), value
    FROM `Db.table1`
    CROSS JOIN UNNEST(record.atr) AS atr
    CROSS JOIN UNNEST(atr.value) AS value;

    Wenn Sie wollen zu bekommen eine Reihe sogar für die leere arrays verwenden, können Sie LEFT JOIN statt:

    #standardSQL
    SELECT * EXCEPT(value), value
    FROM `Db.table1`
    LEFT JOIN UNNEST(record.atr) AS atr
    LEFT JOIN UNNEST(atr.value) AS value;

    Hier ist eine Beispiel-Abfrage, können Sie versuchen, ausgeführt:

    #standardSQL
    WITH Input AS (
      SELECT STRUCT(ARRAY<STRUCT<x STRING, value ARRAY<INT64>>>[('foo', [1, 2]), ('bar', [3, 4, 5])] AS atr) AS record UNION ALL
      SELECT STRUCT(ARRAY<STRUCT<x STRING, value ARRAY<INT64>>>[('baz', [6, 7])])
    )
    SELECT * EXCEPT (value)
    FROM Input
    CROSS JOIN UNNEST(record.atr) AS atr
    CROSS JOIN UNNEST(atr.value) AS value;
    • Danke für die Antwort. Jetzt verstehe ich, es wird glätten Tabellen, aber nicht in arrays automatisch. Ich werde es ausprobieren.
    • Okay, neue Fehlermeldung: „Spalte atr in SELECT * AUSNAHME-Liste nicht vorhanden ist [1:18]“
    • Versuchen Sie, nur mit SELECT * ohne EXCEPT (atr).
    • Abfrage war syntatically richtig, aber ein Fehler aufgetreten ist: Fehler: Doppelte Spaltennamen im Ergebnis werden nicht unterstützt. Gefunden duplicate(s): Wert
    • Es war value dass ich brauchte, um in die EXCEPT Liste…ich aktualisierte die Antwort.
    • Yup! Das hat es, Danke nochmal!

  2. 1

    Wie kann ich die konvertieren dass es sich hierbei um Standard-SQL-Abfrage?

    SELECT * FROM `DB.Tabelle1″

    In dem Datensatz.atr.Wert IN „1“

    Unten ist für BigQuery Standard-SQL

    #standardSQL
    SELECT *
    FROM `DB.table1`
    WHERE (SELECT COUNT(1) 
            FROM UNNEST(record.atr) AS atr, 
                  UNNEST(atr.value) AS val 
            WHERE val IN ('1')) > 0  

    Können Sie es testen mit dummy-Daten (teilweise geliehen von Elliott ‚ s Beispiel)

    #standardSQL
    WITH `DB.table1` AS (
      SELECT 1 AS id, STRUCT([STRUCT<x STRING, value ARRAY<STRING>>('foo', ['1', '2']), ('bar', ['3', '4', '5'])] AS atr) AS record UNION ALL
      SELECT 2, STRUCT([STRUCT<x STRING, value ARRAY<STRING>>('baz', ['6', '7'])])
    )
    SELECT *
    FROM `DB.table1`
    WHERE (SELECT COUNT(1) 
            FROM UNNEST(record.atr) AS atr, 
                  UNNEST(atr.value) AS val 
            WHERE val IN ('1')) > 0

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.