有一个简单的数据库实体:
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"
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"