2017-03-24 1 views
2

Ich versuche, nach einer Zeile zu suchen, die bestimmte Schlüsselwertpaare in einem Array hat. Eine Zeile in meiner BigQuery-Tabelle würde ungefähr so ​​aussehen.Wie finde ich Elemente in einem Array in BigQuery

{ 
    "ip": "192.168.1.1", 
    "cookie" [ 
    { 
     "key": "apple", 
     "value: "red" 
    }, 
    { 
     "key": "orange", 
     "value: "orange" 
    }, 
    { 
     "key": "grape", 
     "value: "purple" 
    } 
    ] 
} 

Ich dachte über impliziten UNNEST oder CROSS JOIN wie die folgenden verwenden, aber es hat, weil es nicht funktionierte Auseinanderschieben nur mehr verschiedene Reihen schaffen würde.

SELECT ip 
FROM table t, t.cookie c 
WHERE (c.key = "grape" AND c.value ="purple") AND (c.key = "orange" AND c.value ="orange") 

This link ist ganz in der Nähe zu dem, was ich tun will, es sei denn sie legacy SQL verwenden und nicht standardSQL

Antwort

2
#standardSQL 
SELECT ip 
FROM yourTable 
WHERE (
    SELECT COUNT(1) 
    FROM UNNEST(cookie) AS pair 
    WHERE pair IN (('grape', 'purple'), ('orange', 'orange')) 
) >= 2 

Sie es mit unter Blinddaten

#standardSQL 
WITH yourTable AS (
    SELECT '192.168.1.1' AS ip, [('apple', 'red'), ('orange', 'orange'), ('grape', 'purple')] AS cookie UNION ALL 
    SELECT '192.168.1.2', [('abc', 'xyz')] 
) 
SELECT ip 
FROM yourTable 
WHERE (
    SELECT COUNT(1) 
    FROM UNNEST(cookie) AS pair 
    WHERE pair IN (('grape', 'purple'), ('orange', 'orange')) 
) >= 2 

Bei testen Wenn Sie eine Ausgabe-IP benötigen, wenn mindestens ein Paar im Array ist - müssen Sie >= 2 zu >=1 inändernSatz

+0

Arbeitete wie ein Charme, danke. Ich wusste nicht, dass Sie Unterabfragen auch in WHERE-Bedingungen schreiben können – dorachan2010

+0

@ dorachan2010 - ja, aber bitte beachten Sie: 'Korrelierte Unterabfragen, die auf andere Tabellen verweisen, werden nur unterstützt, wenn sie dekorreliert werden können, z JOIN' Sie können http://stackoverflow.com/a/43006968/5221944 überprüfen, um zu sehen, wie korrelierte Abfrage in Join umgewandelt wurde, um Fehlermeldung zu vermeiden –

+0

Ja, das versuche ich immer noch für SQL und BigQuery SQL zu verstehen ... der Umfang der Referenzen in jeder der Erklärung .. – dorachan2010

1

Mikhails Lösung ist gut, wenn garantiert ist, dass es im Array cookie keine doppelten Paare gibt. Aber wenn es Duplikate sein könnte, hier ist die alternative Lösung:

#standardSQL 
WITH yourTable AS (
    SELECT 
    '192.168.1.1' AS ip, 
    [('apple', 'red'), ('orange', 'orange'), ('grape', 'purple')] AS cookie UNION ALL 
    SELECT 
    '192.168.1.2', 
    [('abc', 'xyz'), ('orange', 'orange'), ('orange', 'orange')] 
) 
SELECT ip 
FROM yourTable t 
WHERE (
    ('grape', 'purple') IN UNNEST(t.cookie) AND 
    ('orange', 'orange') IN UNNEST(t.cookie)) 

Ergebnisse in nur

ip 
----------- 
192.168.1.1 
+0

Ich gab Mikhail das Lösungs-Tag, weil es den Job gemacht hat und schneller war. Aber gut zu wissen, über das Duplikat würde mehrere Male zählen, danke – dorachan2010

Verwandte Themen