如何将`inSet`与列的元组一起使用?

Posted

技术标签:

【中文标题】如何将`inSet`与列的元组一起使用?【英文标题】:How to use `inSet` with tuple of columns? 【发布时间】:2022-01-13 07:58:36 【问题描述】:

在 Slick 中,我们可以对单个列使用 inSet 来执行 sql IN 子句。但我不知道如何将它与一对列一起使用。

PostgresQL 允许IN 的以下用法:

select * from table where (table.a, table.b) in ( values
 (1, 'foo'),
 (2, 'bar')
)

我认为我可以在 slick 中执行以下操作,但它无法编译:

TableQuery[Table].filter(
  row => (row.a, row.b) inSet Seq(
    (1, "foo"),
    (2, "bar"))
  )

有可能让它工作吗?

【问题讨论】:

【参考方案1】:

现在您可以手动完成,编写如下内容:

val expectedTuples = Seq(
  (1, "foo"),
  (2, "bar"),
  (3, "baz")
)

TableQuery[Table].filter(
  row =>
    expectedTuples.map
      case(fst, snd) => row.a === fst && row.b === snd
    .reduce(_ || _)
)

这是已知的feature request in slick。

【讨论】:

我想不出减少Rep[Boolean]s 来合并它们。好主意。但我认为这有点低效,因为它总是会检查每个元组。就我而言,我有数千个元组,所以我想我会使用原始 sql。

以上是关于如何将`inSet`与列的元组一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 数据库查询中查询列的元组?

如何对返回 orm 对象和自定义列的元组的查询进行正确排序、分组?

如何修复特征联合和管道中的元组对象错误(使用 sklearn 时)?

如何将元组列表转换为 pandas 数据框,以便每个元组的第一个值代表一列?

MDX:如何将具有多个成员的元组转换为具有单个成员的元组?

如何将列表(元组内)中的元组转换为列表?