Scala Дуб ie ничего не возвращает при использовании ИЛИ ГДЕ - PullRequest
2 голосов
/ 18 февраля 2020

Я пытаюсь выбрать из базы данных с несколькими фильтрами. Код:

// 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%', но в Doob ie нет необходимости использовать ', поэтому даже одно имя ничего не даст: SELECT * FROM phonebook WHERE name LIKE 'Jhon%'.

1 Ответ

1 голос
/ 03 марта 2020

Интерполированное значение (query) используется в качестве параметра значение по вашему выбору. Поэтому, когда у вас есть несколько имен, ваш фактический SELECT будет выглядеть как SELECT * FROM phonebook WHERE name LIKE 'Jhon% OR name LIKE Lena%' (обратите внимание, где одиночные кавычки - они включают фразу «ИЛИ КАК»).

Используйте ++ для 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)
...