You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala结合Doobie:如何查询PostgreSQL的数组/JSONB列?

PostgreSQL数组列查询及Doobie实现方案

你当前的问题是用错了PostgreSQL数组的查询操作符——?是jsonb类型专属的操作符,不适用于text[]数组,所以代码没按预期生效。下面给你两种可行方案:

一、保留text[]数组类型的修复方案

PostgreSQL查询text[]数组包含指定元素,有两种常用写法:

1. 使用= ANY()操作符

这种写法直观易懂,直接判断目标值是否是数组中的任意元素:

def getPlayers(result: String): Query[Long] = {
  sql"select id from players where $result = ANY(results)".query[Long]
}

注:原函数参数中的id在SQL里未用到,这里暂时移除;另外id字段是bigint类型,对应Scala的Long而非Int,要保证类型匹配。

2. 使用@>操作符

该操作符用于判断数组是否包含指定子数组,因此需要把参数包装成单元素数组:

def getPlayers(result: String): Query[Long] = {
  sql"select id from players where results @> ARRAY[$result]::text[]".query[Long]
}

Doobie会自动处理参数绑定,无需额外编写类型转换代码。

二、换成jsonb类型的简化方案

如果换成jsonb数组类型(字段定义为results jsonb),确实能简化查询,也可以用你最初想的?操作符:

首先修改表结构:

create table if not exists players
(
  id bigint,
  name text,
  results jsonb
);

然后对应的Doobie代码:

def getPlayers(result: String): Query[Long] = {
  sql"select id from players where results ? $result".query[Long]
}

这种写法更符合你最初的预期,而且jsonb支持更复杂的查询(比如嵌套结构、路径查询),后续有扩展需求时灵活性更高。

内容的提问来源于stack exchange,提问作者Developus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:55:24