Scala Doobie 在使用 OR WHERE 时不会 return 任何东西
Scala Doobie does not return anything when using OR WHERE
我正在尝试 select 使用多个过滤器从数据库中获取。代码:
// 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中不需要使用'
,所以即使一个名字也不会return任何东西:SELECT * FROM phonebook WHERE name LIKE 'Jhon%'
.
内插值 (query
) 在您的 select 中用作参数 value。所以当你有多个名字时,你的实际 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)
我正在尝试 select 使用多个过滤器从数据库中获取。代码:
// 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中不需要使用'
,所以即使一个名字也不会return任何东西:SELECT * FROM phonebook WHERE name LIKE 'Jhon%'
.
内插值 (query
) 在您的 select 中用作参数 value。所以当你有多个名字时,你的实际 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)