Гладкий Postgres: Как выполнить поиск в списке строк с помощью оператора like

#postgresql #scala #playframework #slick

Вопрос:

Существует простая сущность базы данных:

 case class Foo(id: Option[UUID], keywords: Seq[String])  

Я хочу реализовать функцию поиска, которая возвращает все сущности типа Foo , у которых есть хотя бы одно ключевое слово, содержащее строку поиска.

Я использую Слик и попробовал это:

 def searchKeywords(txt: String): Future[Seq[Foo]] = {  val action = Foos.filter(p =gt; p.keywords.any like s"%$txt%").result  db.run(action) }  

Этот фрагмент кода компилируется, но при выполнении я получаю эту ошибку SQL:

PSQLException: ERROR: syntax error at or near "any"

Сгенерированная инструкция sql выглядит следующим образом:

select "id", "title", "tagline", "logo", "short_desc", "keywords", "initial_condition", "work_process", "end_result", "ts", "lm", "v" from "projects" where any("keywords") like '%foo%'

И это не работает с postgresql. (Я использую v12)

Схема таблицы выглядит следующим образом:

 CREATE TABLE foos (  id UUID NOT NULL PRIMARY KEY,  keywords varchar[] NOT NULL );  

Как я могу выполнить поиск в списке строк с помощью like оператора?

Ответ №1:

С точки зрения чистого SQL, для этого вам нужна производная таблица. Я надеюсь, что какой-нибудь эксперт поправит меня, если я ошибаюсь, но вы не можете использовать оператор SQL, как в массиве.

Предположим, что ваша конструкция таблицы :

 CREATE TABLE foos (  id UUID NOT NULL PRIMARY KEY,  keywords varchar[] NOT NULL );  

Тогда SQL-способом получения результатов будет :

 select * from (  select id, unnest(keywords) as keyw from foos  ) myTable where keyw like '%foo%'  

В противном случае синтаксис, который вы используете для like оператора, кажется правильным.

 myProperty like s"%$myVariable"  

Комментарии:

1. Код компилируется. Он не компилируется без .any . Я не реализовал какой-либо постфиксный метод. .any поставляется с slickpg. Я попробовал List[String] с тем же результатом.

2. не могли бы вы распечатать сгенерированный sql-запрос, пожалуйста ? вы можете использовать .statements для получения сгенерированного запроса

3. пожалуйста, взгляните. Я обновил свой пост с помощью сгенерированного sql.

4. не могли бы вы также распечатать схему вашей таблицы, пожалуйста ?

5. схема sql добавлена в сообщение.