Scala Doobie 在使用 OR WHERE 时不会返回任何内容

标签 scala doobie

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

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

最佳答案

插值(查询)在您的选择中用作参数。因此,当你有多个名字时,你的实际 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)

关于Scala Doobie 在使用 OR WHERE 时不会返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60276676/

相关文章:

sql - 如何将完整的查询作为参数传递

scala - 如何从 Async[IO] 创建 Async[Future]

scala - 杜比。组合 .update.withGeneratedKeys() 和 .update.run

scala - 在 doobie 中为 for-comprehension 编写可选查询?

Scala 在生产中启动 Play 服务器

java - 函数式编程应用

scala - Scala 中的多个 flatMap

scala - 如何禁用原始类型的所有隐式转换?

scala - 如何在单独的线程中运行代码?

scala - 如何使用 Doobie (scala) 动态生成 SQL 语句