为何在HANA SQL的IN()语句中需对ARRAY变量使用UNNEST?
HANA SQL中ARRAY变量无法直接用于WHERE IN()的原因解析
在HANA SQL里,WHERE ... IN()的语法有明确要求:它只能接收逗号分隔的离散值列表,或者返回单列结果的子查询,并不直接支持ARRAY类型变量作为输入参数,这就是直接用:variable1会失败的核心原因。
无效写法分析
直接把ARRAY变量传入IN()的写法,HANA的SQL解析器无法自动将ARRAY这个复合类型展开成IN()需要的离散值集合,会触发类型不匹配或语法校验错误:
CREATE PROCEDURE UPDATE_TABLE() AS BEGIN -- Define default filter values DECLARE variable1 NVARCHAR(255) ARRAY = ARRAY('default_value1','default_value2'); -- Update the specified columns for matching rows UPDATE TABLE SET COLUMN = '1' WHERE COLUMN IN (:variable1); -- 直接传入ARRAY变量不符合IN()语法要求 END;
有效写法原理
UNNEST()函数的作用就是将ARRAY类型转换为行级的临时表结构,把数组中的每个元素拆成单独的行。之后通过子查询从这个临时表中取出单列值,就完全符合IN()对输入格式的要求了:
CREATE PROCEDURE UPDATE_TABLE() AS BEGIN -- Define default filter values DECLARE variable1 NVARCHAR(255) ARRAY = ARRAY('default_value1','default_value2'); -- Create table for ARRAY variable(s) variable1_table = UNNEST(:variable1) AS ("VAR1"); -- Update the specified columns for matching rows UPDATE TABLE SET COLUMN = '1' WHERE COLUMN IN (SELECT "VAR1" FROM :variable1_table); -- 子查询返回离散值列表,符合IN()要求 END;
简单来说,IN()不认“数组”这种打包好的对象,只认一个个拆出来的独立值,UNNEST就是帮你完成拆包的关键步骤。
内容的提问来源于stack exchange,提问作者NCFY
相关产品推荐
相关产品推荐

