【问题标题】:Is there a way to use Coalesce in where clause using findoptions?有没有办法在使用 findoptions 的 where 子句中使用 Coalesce?
【发布时间】:2021-07-29 18:22:43
【问题描述】:

我对 typeorm 比较陌生,并且在使用 FindOptions 重新创建我们的一个查询时遇到了一些问题。我找到了一种使用 typeorms QueryBuilder 编写它的方法,但想利用 typeorm 在使用其 findOptions 时提供的一些其他功能(例如定义实体关系时的渴望标志)。

const sql = this.repository
      .createQueryBuilder('table1','t1')
      .where('COALESCE(t1.deleted_at, t1.updated_at, t1.created_at) >= :timestamp', {
        timestamp: timestamp,
      })

我找不到任何与在 typeorm 中使用合并相关的文档或示例。具体来说,这是我似乎无法用 findOptions 重写的部分

.where('COALESCE(t1.deleted_at, t1.updated_at, t1.created_at) >= :timestamp', {
        timestamp: timestamp,
      })

我尝试了类似的东西

this.repository.find({
      where: Raw('COALESCE(t1.deleted_at, t1.updated_at, t1.created_at) >= :timestamp', {
        timestamp: timestamp,
      }),

但显然这不是有效的语法,因为 Raw() 需要列别名。希望这已经充分描述了我的问题!

PS。我是 SO 新手,如有任何关于如何提高我的问题质量的反馈,我将不胜感激

【问题讨论】:

    标签: sql typeorm


    【解决方案1】:

    目前 TypeORM 在 find-where 子句中没有 COALESCE operator,因为(正如您所写的)它需要一个别名。

    您可以使用有效列来欺骗 TypeORM 结合 where 子句和 Raw(忽略带有 _ 的别名)。 请参阅this 了解更多信息。 但是,这有点令人困惑,并且不纯粹正确。

    const result = await this.repository.find({
      where: {
        created_at: Raw(_ => `COALESCE(deleted_at, updated_at, created_at) >= :timestamp`, { timestamp })
      }
    });
    

    最正确的方法是使用QueryBuilder

    const result = await this.repository
      .createQueryBuilder('table1', 't1')
      .where('COALESCE(t1.deleted_at, t1.updated_at, t1.created_at) >= :timestamp', {
        timestamp: timestamp,
      })
      .getMany();
    

    【讨论】:

    • 谢谢!那个下划线是我遗漏的部分。我接受了您的回答,但很好奇您如何确定可以跳过别名。即使现在回去知道要寻找什么,我似乎也无法在他们的文档中找到。无论如何,再次感谢!
    • this 图片。如您所见,Raw 接受一个带有名为alias 的参数的函数。 alias 标识当前 where 子句中的列,您可以使用它来compose 原始查询。在我们的例子中,我们不需要使用别名,所以我们用 _ 跳过它(告诉 Typescript 编译器我们忽略了这个参数)。
    • 感谢您的解释!我不知道我可以通过 _ 忽略 TS 中的参数。为什么我从未在 typeorm 文档中遇到过这种情况是有道理的:D 我很感激!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2021-11-14
    相关资源
    最近更新 更多