SQL报错‘No matching signature for operator =’的含义及问题咨询
错误含义解析与SQL修复方案
错误提示的具体含义
No matching signature for operator = for argument types: STRING, STRUCT<start_station_id INT64, number_of_rides INT64>. Supported signature: ANY = ANY at [18:54]
这段错误的核心是类型不兼容导致的相等比较失败:
- 你试图用
=比较的两个值,一个是citibike_stations表中字符串类型的station_id字段 - 另一个是你给子查询起的别名
start_station_id——这个别名对应的是整个子查询的结果行(BigQuery会把单行数据视为包含start_station_id和number_of_rides两个字段的STRUCT结构) - BigQuery没有支持「字符串」和「STRUCT结构」直接用
=比较的规则,因此抛出该错误。
错误根源
问题出在子查询的别名命名上:你把子查询的别名设为start_station_id,和子查询内部的字段名完全重名。当你在JOIN的ON条件里写station_id = start_station_id时,BigQuery会优先把start_station_id解析为子查询的别名(即整个STRUCT行),而非子查询里的INT64类型字段,最终导致类型不匹配。
修复后的SQL代码
SELECT station_id, name, number_of_rides AS number_of_rides_starting_at_station FROM ( SELECT start_station_id, COUNT(*) AS number_of_rides FROM bigquery-public-data.new_york_citibike.citibike_trips GROUP BY start_station_id ) AS start_rides -- 修改子查询别名,避免与字段名冲突 INNER JOIN bigquery-public-data.new_york.citibike_stations ON station_id = CAST(start_rides.start_station_id AS STRING) -- 统一字段类型:将INT64转为STRING匹配 ORDER BY number_of_rides DESC;
额外说明:原查询中citibike_stations的station_id是字符串类型,子查询的start_station_id是INT64类型,即使修正了别名,也需要转换类型才能完成匹配,否则仍会出现类型不兼容问题。
内容的提问来源于stack exchange,提问作者Haneen Shouman
相关产品推荐
相关产品推荐

