Slick Postgres:如何使用like操作符在字符串列表中搜索



有一个简单的数据库实体:

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

我想实现一个搜索函数,它返回类型为Foo且至少有一个关键字包含搜索字符串的所有实体。

我用的是Slick,然后试了试:

def searchKeywords(txt: String): Future[Seq[Foo]] = {
val action = Foos.filter(p => 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操作符的字符串列表中搜索?

从纯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"

最新更新