【问题标题】:How to use `inSet` with tuple of columns?如何将`inSet`与列的元组一起使用?
【发布时间】: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"))
  )

有可能让它工作吗?

【问题讨论】:

    标签: postgresql scala slick


    【解决方案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。
    猜你喜欢
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多