我需要离开两张桌子:
我做了这样的事:
SELECT
CASE
WHEN b.domain IS NULL then "Invalid"
ELSE "Valid"
END as Validated
FROM Emails e
LEFT JOIN DomainBlacklist b
ON ENDS_WITH(LOWER(e.email), LOWER(b.domain))却让我犯了一个错误:
“如果没有连接两侧字段相等的条件,则不能使用左外部联接。”
有人知道我该怎么解决这个问题吗?
谢谢!
发布于 2017-11-29 18:52:38
下面是用于BigQuery标准SQL的
#standardSQL
SELECT email,
IF(MAX(ENDS_WITH(LOWER(email), LOWER(domain))), 'invalid', 'valid') AS Validated
FROM `project.dataset.Emails`
CROSS JOIN `project.dataset.DomainBlacklist`
GROUP BY email 您可以使用以下虚拟数据测试/播放上述查询
#standardSQL
WITH `project.dataset.Emails` AS (
SELECT email
FROM UNNEST(['user1@abc.com','user2@abc.com','user3@uvw.com','user4@xyz.com']) AS email
), `project.dataset.DomainBlacklist` AS (
SELECT domain
FROM UNNEST(['uvw.com','qwe.net']) AS domain
)
SELECT email,
IF(MAX(ENDS_WITH(LOWER(email), LOWER(domain))), 'invalid', 'valid') AS Validated
FROM `project.dataset.Emails`
CROSS JOIN `project.dataset.DomainBlacklist`
GROUP BY email 结果是
email Validated
user1@abc.com valid
user2@abc.com valid
user3@uvw.com invalid
user4@xyz.com valid 发布于 2017-11-29 18:50:26
从理论上讲,应该可以用相等的方式将其表示为联接;您需要首先从电子邮件地址中删除@:
SELECT
CASE
WHEN b.domain IS NULL then "Invalid"
ELSE "Valid"
END as Validated
FROM Emails e
LEFT JOIN DomainBlacklist b
ON LOWER(SPLIT(e.email, '@')[SAFE_OFFSET(1)]) = LOWER(b.domain)使用样本数据:
WITH Emails AS (
SELECT 'elliott@example.com' AS email UNION ALL
SELECT 'a@b.com' UNION ALL
SELECT 'invalid_email' UNION ALL
SELECT 'foo@bar.com'
), DomainBlacklist AS (
SELECT 'example.com' AS domain UNION ALL
SELECT 'bar.com'
)
SELECT
CASE
WHEN b.domain IS NULL then "Invalid"
ELSE "Valid"
END as Validated
FROM Emails e
LEFT JOIN DomainBlacklist b
ON LOWER(SPLIT(e.email, '@')[SAFE_OFFSET(1)]) = LOWER(b.domain)https://stackoverflow.com/questions/47559356
复制相似问题