如何将列表作为参数传递给postgres
how to pass a list into postgres as a parameter
我正在尝试 运行 使用 typeorm
const fields = await queryRunner.query(
`SELECT "fieldId", "name" FROM "field" WHERE "name" IN () `,
[...fieldNames]
);
其中 fieldNames 是一个列表。但是我收到一条错误消息 bind message supplies 5 parameters
有没有什么方法可以使这个动态化,这样我就可以传递一个列表并获得返回值?这不是 orm 类型独有的——这是 postgres
的问题
IN
查询的每个元素都是一个单独的参数。如果你想传递五个元素,你需要五个参数。
SELECT "fieldId", "name"
FROM "field"
WHERE "name" IN (,,,,)
这意味着动态生成 SQL 以匹配您拥有的值的数量。
Postgres 提供了一种更好的方法。使用 any
operator。这适用于作为单个值的数组。
SELECT "fieldId", "name"
FROM "field"
WHERE "name" = ANY()
现在您应该能够传递一个值数组作为您的第一个参数。 Typeorm 应该将其转换为 Postgres Array.
const sql = `
select fieldId, name
from field
where name = ANY()
`
const values = [['manny','moe','jack']]
client.query(sql, values)
这应该导致:
select fieldId, name
from field
where name = ANY(ARRAY['manny','moe','jack'])
我正在尝试 运行 使用 typeorm
const fields = await queryRunner.query(
`SELECT "fieldId", "name" FROM "field" WHERE "name" IN () `,
[...fieldNames]
);
其中 fieldNames 是一个列表。但是我收到一条错误消息 bind message supplies 5 parameters
有没有什么方法可以使这个动态化,这样我就可以传递一个列表并获得返回值?这不是 orm 类型独有的——这是 postgres
的问题IN
查询的每个元素都是一个单独的参数。如果你想传递五个元素,你需要五个参数。
SELECT "fieldId", "name"
FROM "field"
WHERE "name" IN (,,,,)
这意味着动态生成 SQL 以匹配您拥有的值的数量。
Postgres 提供了一种更好的方法。使用 any
operator。这适用于作为单个值的数组。
SELECT "fieldId", "name"
FROM "field"
WHERE "name" = ANY()
现在您应该能够传递一个值数组作为您的第一个参数。 Typeorm 应该将其转换为 Postgres Array.
const sql = `
select fieldId, name
from field
where name = ANY()
`
const values = [['manny','moe','jack']]
client.query(sql, values)
这应该导致:
select fieldId, name
from field
where name = ANY(ARRAY['manny','moe','jack'])