2017-08-25 2 views
0

Gibt es eine Möglichkeit, 2 Spalten in BQ zu vergleichen?String-Matching von 2 Spalten

Ich habe versucht, die folgenden:

SELECT 
    T1.id, 
    CASE 
    WHEN REGEXP_CONTAINS(geo, countries) THEN TRUE 
    ELSE FALSE 
    END AS geo_match 
FROM 
    T1 
LEFT JOIN 
    T2 
ON 
    T1.id = T2.id 

und bekam die folgende Fehlermeldung:

No matching signature for function REGEXP_CONTAINS for argument types: STRING, ARRAY<STRING>. Supported signatures: REGEXP_CONTAINS(STRING, STRING); REGEXP_CONTAINS(BYTES, BYTES) at [4:10] 

Ich habe auch versucht LIKE Funktion. Hat nie funktioniert.

Antwort

3

ist unten für BigQuery Standard-SQL I

Basierend auf Fehlermeldung annehmen, dass geo ein String ist und countries ist eine wiederholte Zeichenfolge (Array):

#standardSQL 
SELECT 
    T1.id, 
    (SELECT COUNT(1) FROM UNNEST(countries) AS country WHERE geo = country) > 0 AS geo_match 
FROM T1 LEFT JOIN T2 
ON T1.id = T2.id 
ORDER BY id 

Basierend auf Ihren Anforderungen können Sie Verwenden Sie eine beliebige Vergleichslogik (LIKE, REGEXP_CONTAINS usw.) statt einfach

WHERE geo = country 

Sie können spielen/Test mit Dummy-Daten, wie unten

#standardSQL 
WITH T1 AS (
    SELECT 1 AS id, 'US' AS geo UNION ALL 
    SELECT 2, 'UK' UNION ALL 
    SELECT 3, 'MX' UNION ALL 
    SELECT 4, 'CA' 
), 
T2 AS (
    SELECT 1 AS id, ['US', 'UK'] AS countries UNION ALL 
    SELECT 2, ['MX', 'CA'] UNION ALL 
    SELECT 3, ['MX', 'CA'] 
) 
SELECT 
    T1.id, 
    (SELECT COUNT(1) FROM UNNEST(countries) AS country WHERE geo = country) > 0 AS geo_match 
FROM T1 LEFT JOIN T2 
ON T1.id = T2.id 
ORDER BY id 
+0

perfekt funktioniert! Vielen Dank! – hamsy