31

也许是一个愚蠢的问题。但到目前为止我还没有找到答案。那么如何在SLICK中表示 SQL 的“LIKE”运算符?

4

3 回答 3

48

和平时一样!

val query = for {
  coffee <- Coffees if coffee.name like "%expresso%"
} yield (coffee.name, coffee.price)

会生成类似 SQL

SELECT name, price FROM coffees WHERE NAME like '%expresso%';
于 2013-02-05T06:05:49.337 回答
3

这就是我让它工作的方式:

// argMap is map of type [Str, Str]
val query = for {
    coffee <- coffees if (
      argMap.map{ case (k,v) =>
        metric.column[String](k) like s"%${v}%"
      }.reduce(_ && _)
    )
  } yield(coffee.name)

然后你可以使用你的数据库运行它: val res = db.run(query.result)

当然res,这里有一个未来,您需要使用 await 来获得实际结果。

于 2019-12-17T21:14:52.210 回答
0

假设您有一个名为的表,logs其中包含 3 个字段 -

  1. ID
  2. 信息
  3. 约会时间

您要执行 LIKE 操作。所以它将是:

 def data(data: ReqData): Future[Seq[Syslog]] =  {
      sysLogTable
        .filter(_.datetime >= data.datetimeFrom)
        .filter(_.datetime <= data.datetimeUntil)
        .filter(_.message like s"%${data.phrase}%")
        .result
 }

注意:对于 sysLogTable

val sysLogTable: TableQuery[SyslogsTable] = TableQuery[SyslogsTable]
class SyslogsTable(tag: Tag) extends Table[Syslog](tag, "logs") {
  def id = column[Long]("id", O.PrimaryKey, O.AutoInc)

  def message = column[String]("message")

  def datetime = column[Timestamp]("date")

  def * = (id.?, message, datetime) <> ((Syslog.apply _).tupled, Syslog.unapply)
}

注意:对于 Syslog 案例类

case class Syslog(
   id: Option[Long],
   message: String,
   datetime: Timestamp
)
于 2021-05-06T18:20:04.317 回答