Snowflake Native App输出作子查询无结果,Flatten临时表失效求助
问题分析与解决方案
核心错误点
IN子查询的误用
app.code_schema.search返回的是完整数组值(如['Tomato', 'Tom']),直接放入IN子查询时,数据库会把整个数组当作单个匹配值,而EMPLOYEE_NAME是单个字符串,自然无法匹配,导致无结果。临时表创建的语法错误
创建临时表时,PARSE_JSON(SELECT app.code_schema.search(...))是错误的嵌套查询写法,正确逻辑是直接将search的结果传入PARSE_JSON,不需要嵌套SELECT。Flatten展开时的错误取值
数组中的元素是纯字符串(不是带name键的对象),但你用Y.value:"name"去取值,相当于在字符串对象里查找不存在的name属性,因此返回空表。
修正后的解决方法
方法1:修正临时表与Flatten逻辑
先正确创建存储数组的临时表:
CREATE OR REPLACE TEMPORARY TABLE employee_arr ( var variant ) AS SELECT PARSE_JSON(app.code_schema.search($url, $table_name, $column_name, $name_to_search)) AS var;
再展开数组中的字符串元素:
CREATE OR REPLACE TABLE emp AS SELECT Y.value::VARCHAR AS name FROM employee_arr, LATERAL FLATTEN(input => var) Y;
此时查询SELECT * FROM emp;会得到Tomato和Tom两条记录,关联employee表即可获取目标数据:
SELECT e.EMPLOYEE_NAME, e.EMPLOYEE_DEPT FROM employee e JOIN emp ON e.EMPLOYEE_NAME = emp.name;
方法2:无需临时表的更优方案
直接在主查询中用LATERAL FLATTEN展开数组,一步完成查询:
SELECT e.EMPLOYEE_NAME, e.EMPLOYEE_DEPT FROM employee e, LATERAL FLATTEN(input => PARSE_JSON(app.code_schema.search($url, $table_name, $column_name, $name_to_search))) arr WHERE e.EMPLOYEE_NAME = arr.value::VARCHAR;
或者用IN子查询结合展开结果:
SELECT EMPLOYEE_NAME, EMPLOYEE_DEPT FROM employee WHERE EMPLOYEE_NAME IN ( SELECT arr.value::VARCHAR FROM LATERAL FLATTEN(input => PARSE_JSON(app.code_schema.search($url, $table_name, $column_name, $name_to_search))) arr );
内容的提问来源于stack exchange,提问作者Navidk
相关产品推荐
相关产品推荐

