2016-08-08 24 views
1

Ich habe Daten mit einer einzigen Spalte von und Array von IDs, die nicht im JSON-Format sind.Array-Typ in Tabelle?

"100,101,102" 

Ich möchte in der Lage sein, Zeilen abfragen mit so etwas wie

WHERE "101" IN idarray 

aber es scheint, dass der ARRAY Typ nicht als Spaltentyp unterstützt wird.

Gibt es einen Ansatz in BigQuery, wo ein Array oder eine Zeichenfolge mit Trennzeichen abgefragt werden kann, um ein Element zu enthalten? @>

Antwort

2
SELECT * 
FROM (
SELECT idarray FROM 
    (SELECT "100,101,102" AS idarray), 
    (SELECT "200,201,202,1010" AS idarray), 
) as YourTable 
WHERE "," + idarray + "," CONTAINS "," + "101" + "," 

Wie oben, aber "adoptiert" für BigQuery Standard-SQL

WITH YourTable AS (
    SELECT "100,101,102" AS idarray UNION ALL 
    SELECT "200,201,202,1010" AS idarray 
) 
SELECT * 
FROM YourTable 
WHERE CONCAT(",", idarray, ",") LIKE CONCAT("%,", "101", ",%") 

oder

WITH YourTable AS (
    SELECT "100,101,102" AS idarray UNION ALL 
    SELECT "200,201,202,1010" AS idarray 
) 
SELECT * 
FROM YourTable 
WHERE REGEXP_CONTAINS(idarray, r"\b101\b") 

Zum Beispiel in PostgreSQL ich die Array contains Elementsyntax verwenden kann

oder ("pure" Standard SQL-Stil)

WITH YourTable AS (
    SELECT "100,101,102" AS idarray UNION ALL 
    SELECT "200,201,202,1010" AS idarray 
) 
SELECT idarray 
FROM YourTable, UNNEST(SPLIT(idarray)) AS id1 
WHERE id1 = "101" 
+0

Interessanterweise muss ich Legacy SQL auf diesem Ansatz verwenden. Wahrscheinlich kein Problem, aber irgendwelche Ideen, warum dies nicht mit Standard-SQL funktioniert? – MattK

+0

Gibt es Daten zu den Auswirkungen des REGEXP_CONTAINS-Ansatzes auf die Leistung? Das SQL selbst ist "sauberer". – MattK

+1

normalerweise Regexp-Funktionen sind teuer - aber hängt wirklich von tatsächlichen Daten und Volumen - Sie sollten mit diff-Ansätze experimentieren, um für Sie am besten zu wählen. Ich fügte noch etwas hinzu –