Snowflake添加计算geography列报错问题咨询
报错原因
- 第一次建表报错核心原因:计算列的列名和GEOGRAPHY数据类型名完全重名,Snowflake编译SQL时出现标识符解析冲突,误将ST_POINT函数的返回值判定为VARIANT类型,和列声明的类型不匹配。
- 第二次ALTER语句报错核心原因:Snowflake虚拟计算列的表达式仅支持直接引用当前行的同表列做计算,不允许嵌套SELECT子查询,你写的表达式里套了一层针对同表的SELECT,不符合语法规则。
正确实现方案
方案1:建表时直接添加自动计算的地理点列
不要使用和数据类型同名的字段名,直接在计算列表达式中调用空间函数即可,参考SQL:
create or replace table geo ( best_lat double, best_lon double, -- 列名命名为geo_point,避免和GEOGRAPHY类型名冲突 geo_point geography as (ST_POINT(best_lon, best_lat)) );
注意:
ST_POINT和ST_MAKEPOINT函数在Snowflake中逻辑完全等价,参数顺序固定为经度在前、纬度在后,你之前使用的参数顺序是正确的,无需调整。
方案2:给已存在的表新增自动计算的地理点列
去掉表达式里多余的SELECT子查询,直接引用列计算即可,参考SQL:
alter table geo add column geom geography as (ST_MAKEPOINT(best_lon, best_lat));
以上两种方案创建的是虚拟计算列,不会实际占用存储,查询时会自动根据经纬度列实时计算返回地理点值。如果需要固化存储地理点(避免查询时重复计算消耗资源),可以新增普通列后批量更新数据,参考SQL:
-- 新增普通GEOGRAPHY类型列 alter table geo add column geom geography; -- 批量写入所有行的地理点值 update geo set geom = ST_MAKEPOINT(best_lon, best_lat);
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

