2016-03-22 3 views
1

Таблица 1BigQuery сливаться присоединиться, когда ключ является нулевым

+---------+-----------+--------+ 
| user_id | email  | action | 
+---------+-----------+--------+ 
| 1  | [email protected] | open | 
+---------+-----------+--------+ 
| 2  | null  | click | 
+---------+-----------+--------+ 
| 3  | [email protected] | click | 
+---------+-----------+--------+ 
| 4  | [email protected] | open | 
+---------+-----------+--------+ 

Таблица 2

+---------+-----------+--------+ 
| user_id | email  | event | 
+---------+-----------+--------+ 
| 1  | [email protected] | sent | 
+---------+-----------+--------+ 
| null | [email protected] | none | 
+---------+-----------+--------+ 
| 2  | [email protected] | sent | 
+---------+-----------+--------+ 
| 4  | [email protected] | sent | 
+---------+-----------+--------+ 

Я хочу присоединиться на основе t1.user_id = t2.user_id, но когда есть нуль для ключ, присоединиться на t1.email = t2.email

Я попробовал несколько способов регистрации в BigQuery как:
1.) ON COALESCE (t1.user_id, t1.email) = COALESCE (t2.user_id, t2. электронная почта)
2.) ВКЛ на случае, когда t2.user_id не равен нулю, тогда t1.user_id = t2.user_id else t1.email = t2.email end

Ни одна работа. Как это может быть сделано?

+0

SQL имеет «IS DISTINCT »и« НЕ ОТКЛЮЧАЕТСЯ », но я не вижу этого в BigQuery. –

ответ

1

Я бы разделить такие присоединиться к двум отдельные:
Первый - соединит user_id

SELECT * 
FROM table1 AS t1 
JOIN table2 AS t2 
ON t1.user_id = t2.user_id 

Второй - присоединиться по электронной почте для тех Идентификаторов упущенных в первом присоединиться

SELECT * 
FROM (
    SELECT * FROM table1 
    WHERE user_id NOT IN (
    SELECT t1.user_id 
    FROM table1 AS t1 
    JOIN table2 AS t2 
    ON t1.user_id = t2.user_id 
) 
) t1 
JOIN (
    SELECT * FROM table2 
    WHERE user_id NOT IN (
    SELECT t1.user_id 
    FROM table1 AS t1 
    JOIN table2 AS t2 
    ON t1.user_id = t2.user_id 
) 
) t2 
ON t1.email = t2.email 
+0

Спасибо. Я действительно надеялся, что он использует COALESCE. По-видимому, это возможно на основе ссылки. Но, возможно, не поддерживается BigQuery? http://stackoverflow.com/questions/5304184/proper-way-to-refer-to-coalesced-value-in-select-statement – Blake

+0

, но это не так: o ( –

+0

на https://cloud.google.com/bigquery/query-reference # query-grammar: join_predicate: field_from_one_side_of_the_join = field_from_the_other_side_of_the_join [AND ...] –

Смежные вопросы