HANA将JS数组作为参数值绑定到WHERE IN(...)子句

时间:2020-07-07 04:49:53

标签: hana

我在NodeJS项目中使用@sap/hana-client npm模块连接到HANA数据库并运行查询。 我有一个ID列表,希望通过参数化查询将其包含在WHERE ID IN(...) SQL子句中,但似乎无法弄清楚这样做的语法。

这是我想像的样子(但这不起作用,在参数绑定阶段失败)

const ids = [1,2,3,4];
const params = [ids];
const sql = "SELECT * FROM T WHERE ID IN (?)";

// this fails with => code: -20007, message: 'Can not bind parameter(0).', sqlState: 'HY000'
conn.query(sql, params, (err, result) => {
  // process query results or errors
});

我知道在Postgres中可以通过使用UNNEST(...) 1数组函数来做到这一点,但是在HANA中似乎不起作用

1 个答案:

答案 0 :(得分:1)

这是HANA的一个众所周知的困难。 客户端软件本身不支持类似ARRAY的类型。

您的(特殊)情况,即将数组变成IN子句的参数列表,需要付出额外的努力。

例如参见Errors with declared array/table variable values in SAP HanaDB SQL

最重要的是,Postgres专门处理了这种特殊情况,方法是用整个定界值列表替换单个IN子句参数?

HANA不会(遗憾地)没有那样做。

相反,如果您必须提前知道IN列表中有多少个元素(最多),以便可以为每个元素准备一个带有参数?的语句。

或者,您可以使用SQLScript和链接问题中显示的UNNEST构造,也可以创建一个临时表,在其中填充IN-list元素,然后在{{ 1}}-子句(或加入)。

无论哪种方式,手动执行此操作都比较麻烦,我可能会寻找一个可以完成此类工作的框架。

相关问题