You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BigQuery SQL子查询报错:WHERE子句应返回BOOL却返回INT64

解决BigQuery中“WHERE clause should return type BOOL, but returns INT64”报错

错误原因

你遇到的报错核心是:WHERE子句必须返回布尔值(TRUE/FALSE),用来判断哪些行应该被保留。但你的子查询直接返回了start_station_id(INT64类型的数值),数据库无法将数值直接转化为布尔判断,所以抛出这个错误。和空格没有任何关系。

从你的代码逻辑来看,应该是想找出有订阅用户(usertype = 'subscriber')骑行过的Citibike站点,下面提供两种正确的写法:

方法1:使用EXISTS子查询(推荐)

EXISTS专门用于“存在性判断”,子查询只要能找到匹配的记录,就返回TRUE,完全符合WHERE对布尔值的要求:

SELECT
  station_id,
  name
FROM 
  bigquery-public-data.new_york.citibike_stations
WHERE
  EXISTS (
    SELECT 1  -- 这里选任意值都可以,EXISTS只关心是否有匹配记录
    FROM
     bigquery-public-data.new_york.citibike_trips
    WHERE
      usertype = 'subscriber'
      AND start_station_id = citibike_stations.station_id  -- 关联站点ID
  )

方法2:使用IN子查询

如果子查询返回单个字段的列表,可以用IN判断当前字段是否在列表中,这也是布尔判断:

SELECT
  station_id,
  name
FROM 
  bigquery-public-data.new_york.citibike_stations
WHERE
  station_id IN (
    SELECT
      start_station_id
    FROM
     bigquery-public-data.new_york.citibike_trips
    WHERE
      usertype = 'subscriber'
  )

补充说明

  • 两种方法都能实现需求,EXISTS在处理大数据量时性能通常更优,因为它找到第一条匹配记录就会停止判断;
  • 你的原代码里的子查询没有和主表关联,而且可能返回多行,这不仅会导致类型错误,还会引发“子查询返回多行”的额外问题,上面的写法都解决了这个问题。

内容的提问来源于stack exchange,提问作者Tails0298

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 06:39:22