pgsql中处理数组类型字段

1、代码中存入和读取

需要使用自定义转换器

java 复制代码
@Slf4j
public class ArrayTypeHandler extends BaseTypeHandler<List<String>> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType)
            throws SQLException {
        Object[] objects = parameter.toArray();
        Array array = ps.getConnection().createArrayOf("varchar", objects);
        ps.setArray(i, array);
    }

    @Override
    public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return getArray(rs.getArray(columnName));
    }


    @Override
    public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return getArray(rs.getArray(columnIndex));
    }


    @Override
    public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return getArray(cs.getArray(columnIndex));
    }

    private List<String> getArray(Array array) {

        if (array == null) {
            return null;
        }

        try {
            String[] objects = (String[]) array.getArray();
            return Arrays.asList(objects);
        } catch (SQLException e) {
            log.error("sql转换失败");
        }
        return null;
    }
}

本项目使用的ORM框架是mybatis-flex 在字段上添加注解

java 复制代码
@Column(jdbcType = JdbcType.ARRAY,typeHandler = ArrayTypeHandler.class)
    private List<String> swlToCnIds;

然后正常插入、查询即可

2、sql中使用数组属性字段

  • 使用any函数
sql 复制代码
// 是否包含
value = ANY(array)
// 是否有大于值
value > ANY(array)
// 小于同理
value < ANY(array)
// 是否有不等于的
value <> ANY(array)

any和关联查询一起使用

sql 复制代码
SELECT 
    b.*,string_agg(DISTINCT s1.name, ',' order by s1.name) as sw_to_bts,string_agg(DISTINCT s2.name,',' order by s2.name) as sw_to_cn
FROM 
    t_ne_mgr_bsc b
LEFT JOIN 
    t_ne_switch_mgr s1 ON s1.id = ANY(b.swl_to_bts_ids)
LEFT JOIN 
    t_ne_switch_mgr s2 ON s2.id = ANY(b.swl_to_cn_ids)
WHERE 
    b.removed = false
group by b.id

关联查询的结果用函数string_agg聚合 拼接成为一个新字段

(因为id是主键,因此其它列不用写在group by 里面)

相关推荐
杨云龙UP21 分钟前
PostgreSQL 18.4 数据库整库迁移实战:pg_dump 备份与 pg_restore 恢复完整操作手册
运维·服务器·数据库·postgresql·pg_dump·pg_restore
姚远Oracle ACE3 小时前
对比测试了 openGauss、PostgreSQL、Oracle、MySQL 的CPU 指令数
mysql·postgresql·oracle
Darling噜啦啦10 小时前
# MySQL + Milvus = PostgreSQL?一张表搞定 AI Agent 的长时记忆(附完整代码)
后端·postgresql·orm
ly768911 小时前
读懂 PostgreSQL 执行计划:从 EXPLAIN 输出定位 Spring Boot 慢 SQL 的代价估算偏差
spring boot·sql·postgresql·执行计划·explain analyze·慢sql优化
花月C11 小时前
Agent可观测性篇:Grafana
postgresql·grafana
余槐i1 天前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
数据库小学妹1 天前
PostgreSQL表膨胀怎么办?autovacuum清不动的根因与排查命令
数据库·postgresql·表膨胀·mvcc·数据库运维
东风微鸣1 天前
一次断电引发的血案:Ubuntu 26.04 升级中断后的完整救援实录
数据库·ubuntu·postgresql
ly76891 天前
PostgreSQL JSONB 在 Spring Boot 中的读写边界:从 JDBC 类型映射到 GIN 索引失效
spring boot·postgresql·gin·jsonb·pgjdbc·gin 索引
小小龙学IT1 天前
PostgreSQL 服务端机制与 SQL 实战深度解析:从 MVCC 到查询优化器
数据库·sql·postgresql