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 的工作示例?

Play2/Specs2 中的 Slick/Postgres 数据库测试问题

使用LIKE的Postgres节点搜索查询,如何设置%

如何使用 Guice DI 和 Slick 运行 ScalaTest?