【问题标题】:How to use SQL "LIKE" operator in SLICK如何在 SLICK 中使用 SQL“LIKE”运算符
【发布时间】:2013-01-19 23:36:35
【问题描述】:

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

【问题讨论】:

    标签: scala scalaquery slick


    【解决方案1】:

    一如往常!

    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%';
    

    【讨论】:

    • 谢谢。是 scala 查询还是 slick?对我来说,它只适用于 coffe.name.like("%expresso%") (带点分隔符)。
    • @Tim:您的语法等同于 Faiz 提出的语法(注意 coffeename 之间的点)。
    • 不,它不 sschaef。 Faiz 的答案在 name 和 like 之间没有点 - 所以我得到一个编译器错误。如果我用点分隔名称和喜欢 - 没有错误。为什么?我应该导入一些命名空间吗?
    • 有谁知道是否喜欢在绳子上进行卫生处理?
    • if coffee.name like "%${queryStringFromUser}%"
    【解决方案2】:

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

    // 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在这里是一个future,你需要使用await来得到实际结果。

    【讨论】:

      【解决方案3】:

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

      1. 身份证
      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-03-01
        • 2020-09-21
        • 2021-12-11
        • 1970-01-01
        • 2021-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多