【问题标题】:How to destructure an array to POSTGRES parameter?如何将数组解构为 POSTGRES 参数?
【发布时间】:2019-06-07 20:48:01
【问题描述】:

我想知道如何在 TypeORM 或 POSTGRESQL 原始查询中解构数组变量。

我有以下疑问:

getConnection()
        .query(`SELECT m.col1, m.col2, m.col3, t.col1, c.col1
                FROM schema.msomething m
                LEFT JOIN schema.csomething c ON m.col1 = c.col1
                LEFT JOIN schema.tsomething t ON m.col1 = t.col1
                WHERE ((m.start_date, m.end_date) OVERLAPS ($1, $2))
                AND (c.col1 IN ('valueA', 'valueB', 'valueC'))`,
                [
                    start_date,
                    end_date
                ]
        );

此查询按预期工作正常,但我希望 ('valueA', 'valueB', 'valueC') 成为分配给 $3 的动态值,这将是一个 数组

我尝试了以下方法:

AND (c.col1 IN (...$3))

AND (c.col1 IN $3)

...但是任何一个都不起作用。

【问题讨论】:

  • 您应该能够使用命名占位符并说 c.col1 in (:...vals){ vals: ['valueA', 'valueB', 'valueC'] } (github.com/typeorm/typeorm/issues/1239#issuecomment-366955628) 而不是 PostgreSQL 样式的编号占位符。
  • 我需要使用原始查询,因为我在这里使用OVERLAPS:var 的使用在.query() 中不起作用
  • 但是where('... overlaps (:start, :end)', { start: start_date, end: end_date }) 在这种情况下不工作吗?我不认为 ORM 真正理解 SQL,它可能只是结合类型检查和转义进行一些字符串处理。否则,您必须构建正确数量的编号占位符,然后 splat 数组为这些占位符提供值。

标签: node.js postgresql typeorm


【解决方案1】:

可能有点晚了,但我会这样做:

...
`c.col1 = ANY(string_to_array($3,$4))`,
[
  start, end,
  [1,2,3].join(SEP), SEP
]
...

您必须确定,您的 SEP 字符串不在 [1,2,3] 数组的任何项目中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-14
    • 2021-03-15
    • 2010-10-08
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 2021-11-22
    相关资源
    最近更新 更多