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

HANA Bind JS Array as Parameter Value to WHERE IN(...) Clause

我在 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

中似乎不起作用

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

你的(特殊)情况,即将数组转换为 IN 子句的参数列表需要一些额外的努力。

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

最重要的是,Postgres 通过用整个分隔值列表替换单个 IN 子句参数 ? 来专门处理这种特殊情况。

HANA(遗憾地)没有做那样的事情。

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

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

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