【问题标题】:Scala Doobie does not return anything when using OR WHEREScala Doobie 在使用 OR WHERE 时不返回任何内容
【发布时间】:2020-03-03 07:02:04
【问题描述】:

我正在尝试从具有多个过滤器的数据库中进行选择。代码:

// name is List("Denis", "Semen")
val query = name.map(_ + "%").mkString(" OR name LIKE ")  
sql"SELECT * FROM phonebook WHERE name LIKE ${query+"%"}"
   .query[Contact]
   .to[List]
   .transact(tr)

结果查询是这样的:SELECT * FROM phonebook WHERE name LIKE Denis% OR name LIKE Semen%

我什么也没得到。只有当 SELECT 只有一个名称时,我才会得到一些东西:SELECT * FROM phonebook WHERE name LIKE Denis%

我也试过这个:

val query = name.map("'" + _ + "%'").mkString(" OR name LIKE ")  // 'denis%' OR NAME LIKE 'benis%'

结果查询是这样的:SELECT * FROM phonebook WHERE name LIKE 'Jhon%' OR name LIKE 'Lena%',但是在Doobie中不需要使用',所以即使一个名字也不会返回任何东西:SELECT * FROM phonebook WHERE name LIKE 'Jhon%'

【问题讨论】:

  • 我现在使用{ for { n<-names } yield {sql...} }.flatSequence 作为解决方法。

标签: scala doobie


【解决方案1】:

插值 (query) 在您的选择中用作参数。因此,当您有多个名称时,您的实际 SELECT 将看起来像 SELECT * FROM phonebook WHERE name LIKE 'Jhon% OR name LIKE Lena%'(注意单引号的位置 - 它们包括短语“OR LIKE”)。

Fragment 值上使用++ 来构建任意SQL 语句。比如:

val query = name.map(name => fr"name LIKE ${name + "%"}").reduceOption((left, right) => left ++ fr" OR " ++ right).getOrElse(fr"1 = 0")
(sql"SELECT * FROM phonebook WHERE " ++ query)
   .query[Contact]
   .to[List]
   .transact(tr)

【讨论】:

    猜你喜欢
    • 2015-07-18
    • 2017-02-17
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2020-04-27
    • 2019-04-06
    相关资源
    最近更新 更多