首页 > 解决方案 > 在 Slick 中表达 SQL IF ELSE

问题描述

例如,我如何在 Slick 中表达这个 SQL?

如果 id 存在于另一个表中,则选择列为 true / false

join(Services).on(_.mid === _.id).map {
    case (m, s) => (m.id, m.name, ???).mapTo[SomeClass]
}

标签: mysqlscalaslick

解决方案


尝试

  import slick.jdbc.PostgresProfile.api._

  case class Member(id: Int, name: String, phone: String)

  class MemberTable(tag: Tag) extends Table[Member](tag, "members") {
    def id = column[Int]("id", O.PrimaryKey)
    def name = column[String]("name")
    def phone = column[String]("phone")
    def * = (id, name, phone) <> (Member.tupled, Member.unapply)
  }

  case class Service(mid: Int, profile: Int, lastSeen: String)

  class ServiceTable(tag: Tag) extends Table[Service](tag, "services") {
    def mid = column[Int]("mid", O.PrimaryKey)
    def profile = column[Int]("profile")
    def lastSeen = column[String]("last_seen")
    def * = (mid, profile, lastSeen) <> (Service.tupled, Service.unapply)
  }

  val members = TableQuery[MemberTable]
  val services = TableQuery[ServiceTable]
  case class SomeClass(mid: Int, name: String, services: Boolean)

  members.joinLeft(services).on(_.id === _.mid).map {
    case (m, s) => (m.id, m.name, s.isDefined).mapTo[SomeClass]
  }

推荐阅读