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
子句中使用它(或加入它)。
无论哪种方式,手动执行此操作都相当麻烦,我可能会寻找一个可以执行此类操作的框架。
我在 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
子句中使用它(或加入它)。
无论哪种方式,手动执行此操作都相当麻烦,我可能会寻找一个可以执行此类操作的框架。