Snowflake中如何无需枚举所有列定义返回全表的UDTF?
问题:如何创建返回全表所有列的SQL UDTF,无需手动列出所有列定义?
我正在创建如下SQL UDTF:
CREATE OR REPLACE FUNCTION MY_FUNCTION("_ID" VARCHAR(16777216)) RETURNS TABLE LANGUAGE SQL AS ' SELECT * FROM MY_TABLE WHERE IDENTIFICATION = _ID ';
MY_TABLE包含约400列,我希望该函数能返回包含所有列的表,但不想手动在RETURNS TABLE (COLUMN_1 NUMBER(38,0), COLUMN_2 VARCHAR(16777216), .....)里写出所有列及其类型。
我尝试了以下写法:
CREATE OR REPLACE FUNCTION MY_FUNCTION("_ID" VARCHAR(16777216)) RETURNS TABLE () LANGUAGE SQL AS ' SELECT * FROM MY_TABLE WHERE IDENTIFICATION = _ID ';
但系统返回错误:Mismatch between declared return signature column count (0) and actual column count (431),手动列出431列及其类型非常不便。
解决方案
如果使用的是Snowflake(从错误提示特征判断),可以通过RETURNS TABLE LIKE <表名>语法直接复用目标表的结构,无需手动逐个定义列:
CREATE OR REPLACE FUNCTION MY_FUNCTION("_ID" VARCHAR(16777216)) RETURNS TABLE LIKE MY_TABLE LANGUAGE SQL AS ' SELECT * FROM MY_TABLE WHERE IDENTIFICATION = _ID ';
该语法会让函数自动继承MY_TABLE的所有列名、数据类型及约束,完美匹配查询返回的列结构,解决列数不匹配的问题。
如果是其他数据库(比如BigQuery),可通过先创建自定义表类型再引用的方式实现:
- 基于目标表创建自定义类型:
CREATE TYPE MY_TABLE_TYPE AS TABLE (LIKE MY_TABLE);
- 在函数中引用该类型:
CREATE OR REPLACE FUNCTION MY_FUNCTION("_ID" VARCHAR(16777216)) RETURNS MY_TABLE_TYPE LANGUAGE SQL AS ' SELECT * FROM MY_TABLE WHERE IDENTIFICATION = _ID ';
内容的提问来源于stack exchange,提问作者Angie
相关产品推荐
相关产品推荐

