如何将列表作为参数传递给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'])