2017-09-19 2 views
2

Ich habe eine BigQuery-Tabelle mit einem ähnlichen Schema wie im Bild gezeigt, Zeilen, die Arrays von Strukturen enthalten können. Welche Syntax sollte ich verwenden, um eine itemDelta.typeId auf einen anderen Wert zu ändern/zu aktualisieren? (Siehe SQL wenn unklar)Aktualisieren eines Werts in einem ARRAY in einer BigQuery-Tabelle

BigQuerySchema

UPDATE itemInformation 
SET itemDelta.typeId = 9426 
WHERE itemDelta.typeId = 2424; 

UPDATE:

Eine Arbeit um ich gefunden ist eine User-Defined-Funktion zu implementieren. Mit BigQuery können Sie benutzerdefinierte Funktionen mithilfe von JavaScript erstellen. Hier

ist der Code:

CREATE TEMPORARY FUNCTION edit(table ARRAY<STRUCT<typeId INT64, amount INT64>>) 
RETURNS ARRAY<STRUCT<typeId INT64, amount INT64>> 
LANGUAGE js AS """ 
var i; 
for(i = 0; i < table.length; i++) 
{ 
    if(table[i].typeId == 2452) 
    { 
    table[i].typeId = 1000 
    } 
} 
return table; 
"""; 

UPDATE itemInformation 
SET itemDelta = edit(itemDelta) 
where true 
+1

Vorschlag - verwenden JS UDF nicht, ob es einen Weg gibt, gleiche Logik mit reinem SQL auszudrücken. –

+0

Sie haben eine niedrige Rate. Wichtig bei SO - Sie können die akzeptierte Antwort markieren, indem Sie das Häkchen links neben der abgegebenen Antwort unterhalb der Abstimmung setzen. Siehe http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235 warum dies wichtig ist! Es ist auch wichtig, über die Antwort zu stimmen. Stimmen Sie Antworten ab, die hilfreich sind. ... Sie können überprüfen, was zu tun ist, wenn jemand Ihre Frage beantwortet - http://stackoverflow.com/help/someone-answers. Nach diesen einfachen Regeln erhöhen Sie Ihren eigenen Reputationswert und gleichzeitig halten Sie uns motiviert, Ihre Fragen zu beantworten: o) Bitte beachten Sie! –

Antwort

1

Versuchen Sie folgendes:

UPDATE itemInformation 
SET itemDelta = ARRAY(SELECT AS STRUCT * REPLACE(9426 AS typeId) FROM UNNEST(itemDelta)) 
WHERE 2424 IN (SELECT typeId FROM UNNEST(itemDelta)); 

Der Filter ist nicht unbedingt notwendig, aber es kann die Abfrage etwas schneller machen, da es ändert nicht Zeilen, in denen typeId hat verschiedene Werte im Array.

+0

Danke für die Antwort. Das schien mir nicht ganz zu funktionieren. BigQuery beschwert sich mit: Fehler: ARRAY-Unterabfrage kann nicht mehr als eine Spalte haben, wenn Sie SELECT AS STRUCT verwenden, um STRUCT-Werte zu erstellen Ihre Abfrage gab mir jedoch eine Idee. Mit BigQuery können Sie benutzerdefinierte js-Funktionen hinzufügen. Ich habe eine Funktion erstellt, die jedes einzelne itemDelta-Array der Zeilen verarbeitet. Es nimmt die erforderlichen Änderungen vor und gibt dann das neue geänderte Array zurück. – Tobelawe

+0

Hoppla, tut mir leid; Ich musste 'SELECT AS STRUCT 'verwenden. Ich habe die Antwort aktualisiert. Ich würde vorschlagen, keine JavaScript-Funktion zu verwenden, wenn Sie es helfen können, da normalerweise Sie diese Arten von Umwandlungen einfach mit SQL ausdrücken können, das schneller und billiger wird (weniger wahrscheinlich, eine höhere Abrechnungsstufe zu treffen). –

+0

Danke für den Rat. Ich werde es versuchen. – Tobelawe

0
#standardSQL 
UPDATE `yourProject.yourTable.itemInformation` 
SET itemDelta = ARRAY(
    SELECT STRUCT<typeId INT64, amount INT64>(IF(typeId = 2424, 9426, typeId), amount) 
    FROM UNNEST(itemDelta) 
) 
WHERE 2424 IN (SELECT typeId FROM UNNEST(itemDelta)) 
Verwandte Themen