Slick Postgres:如何使用 like 运算符在字符串列表中搜索
Posted
技术标签:
【中文标题】Slick Postgres:如何使用 like 运算符在字符串列表中搜索【英文标题】:Slick Postgres: How to search in a list of strings using the like operator 【发布时间】:2021-12-11 20:17:55 【问题描述】:有一个简单的数据库实体:
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
运算符在字符串列表中进行搜索?
【问题讨论】:
【参考方案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"
【讨论】:
代码编译。没有.any
就无法编译。我没有实现一些后缀任何方法。 .any
带有 slickpg。我尝试使用 List[String]
得到相同的结果。
你能打印生成的sql查询吗?您可以使用.statements
来获取生成的查询
请看一看。我用生成的 sql 更新了我的帖子。
你能把你的表的模式也打印出来吗?
sql 架构已添加到帖子中。以上是关于Slick Postgres:如何使用 like 运算符在字符串列表中搜索的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Slick 在 Postgres 中将 json 对象插入到 jsonb 类型的列中
Slick:如何将 SQL LIKE 语句与 SQL IN 语句结合使用
是否有使用 Postgres 的 Slick 2.0 AutoInc 的工作示例?