2

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

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

4

1 回答 1

1

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

使用++onFragment值构建任意 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)
于 2020-03-02T23:02:04.833 回答