BigQuery - CASE WHEN x IN(来自其他表的字段),导致半连接错误

Posted

技术标签:

【中文标题】BigQuery - CASE WHEN x IN(来自其他表的字段),导致半连接错误【英文标题】:BigQuery - CASE WHEN x IN (field from other table), results in Semijoin error 【发布时间】:2017-12-08 00:41:42 【问题描述】:

我正在尝试根据网站访问者之前是否曾向我们购买过产品来细分他们。当我在 SELECT 语句中输入以下字段时,我得到以下错误:

CASE WHEN fullVisitorId IN (SELECT fullVisitorId FROM [xxxx-0000:36363.unique_FullVisitorIds_of_past_purchasers_table]) THEN "Purchased"
ELSE "Never Purchased" END AS Previous_Purchase

错误:“错误:(L10:20):半连接表达式(即“x IN (SELECT ...)”)仅在 WHERE 或 HAVING 子句中支持。”

我该怎么做呢?

谢谢

【问题讨论】:

您是否尝试过使用standard SQL,它对连接更灵活?如migration guide 中所述,您必须对语法进行一些更新,例如表名。 感谢您的信息。切换到标准 SQL 给我带来了一些其他问题,所以我刚刚使用了如下所述的连接。干杯。 你能解释一下是什么问题吗? 这是一个相当复杂的查询,切换到标准 sql 不知何故要求我取消嵌套 eCommerceAction 字段。 “错误:无法访问类型为 ARRAY> at [39:21] 的字段 eCommerceAction”我真的不知道如何使用 unnest() 和认为这可能会在其余查询中引起进一步的问题。这就是为什么我选择了另一种方式。 原来我在切换到标准 SQL 后取消嵌套的问题在这篇文章中得到了解决 (***.com/questions/41580589/…) 【参考方案1】:

我建议按照以下思路加入一个汇总结果:

SELECT 
    CASE WHEN p.has_purchased = 1 THEN "Purchased"
         ELSE "Never Purchased" 
    END AS Previous_Purchase
FROM existing_from_table f
LEFT JOIN (
    SELECT fullVisitorId, 1 has_purchased
    FROM [xxxx-0000:36363.unique_FullVisitorIds_of_past_purchasers_table]
    GROUP BY fullVisitorId
    ) p on f.fullVisitorId = p.fullVisitorId

nb:使用 group by 以便不影响总行数。

【讨论】:

以上是关于BigQuery - CASE WHEN x IN(来自其他表的字段),导致半连接错误的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver case when问题

SQL Server CASE .. WHEN .. IN 语句

Hive中case when的两种语法

带有case语句的bigquery中的子选择

case when 使用

使用 CASE WHEN 和 IN 在 SQL 中创建计算列