Snowflake如何非永久修改视图列类型实现数据读取
Snowflake临时转换GEOGRAPHY列为VARCHAR读取的方法
不需要执行任何ALTER类的DDL永久修改对象结构,只需要在查询读取阶段做类型转换即可,仅需视图的SELECT权限就能执行,不会对原视图、底层表的数据和结构产生任何改动。
具体操作
- 写查询的时候不要直接用
SELECT *读全列——这种写法会直接读取原GEOGRAPHY类型的无效数据触发报错。手动列出所有需要的字段,针对GEOGRAPHY列单独做查询时的类型转换:
SELECT -- 替换成你实际需要的其他业务列名 COL1, COL2, COL3, -- 把GEOGRAPHY列临时转成VARCHAR,不要直接查原列 TO_VARCHAR("GEOMETRY") AS GEOMETRY_STR FROM "TABLES"."FBN"."TABLE";
- 如果跑上面的查询还是因为无效几何数据中断,把转换函数换成
TRY_TO_VARCHAR就行,遇到坏数据会自动返回NULL,不会让整个查询崩掉,后续你还能根据返回NULL的行定位哪些行的几何数据是无效的:
SELECT * EXCLUDE ("GEOMETRY"), -- 直接排除原GEOGRAPHY列,不用手动列所有其他列 TRY_TO_VARCHAR("GEOMETRY") AS GEOMETRY_STR FROM "TABLES"."FBN"."TABLE";
提示:上面用的
* EXCLUDE是Snowflake原生语法,可以直接选中除指定列之外的所有字段,不用手动敲大量列名,效率更高。
之前操作报错的原因
你之前用的ALTER TABLE ... ALTER COLUMN TYPE是永久修改对象结构的DDL操作,本身就不适合临时导数据的场景:
- 你操作的对象是视图不是物理表,视图存的是查询逻辑,就算有权限也要改视图定义才能调整列类型,完全没必要为了导数据动原对象
- 这类DDL操作需要对象的ALTER甚至OWNER权限,而查询时转换只需要最基础的SELECT权限,刚好匹配你临时读数据的需求
转换后拿到的VARCHAR是标准GeoJSON格式的地理文本,下载到本地后可以直接基于这个文本做几何修复,不会丢失任何原始信息。
内容的提问来源于stack exchange,提问作者Reut
相关产品推荐
相关产品推荐

