PostgreSQL如何合并两列对象数组生成唯一非空的新数组?
合并数组列并生成非空唯一元素的新数组解决方案
嘿,我来帮你搞定这个数组合并去重的问题!先默认你用的是PostgreSQL(毕竟它对数组操作的支持最为广泛,如果是其他数据库可以补充说明),直接上实用的解决方案:
基础场景方案
假设你的表结构大概是这样(把数组类型换成你实际的类型,比如TEXT[]):
CREATE TABLE your_table ( varchar_col VARCHAR, array_col1 INT[], array_col2 INT[] );
你可以通过拆分数组→过滤空值→去重→重新聚合的流程来实现需求,SQL代码如下:
SELECT varchar_col, ARRAY( SELECT DISTINCT unnest(array_cat(array_col1, array_col2)) WHERE unnest(array_cat(array_col1, array_col2)) IS NOT NULL ) AS merged_unique_array FROM your_table;
代码拆解:
array_cat(array_col1, array_col2):将两个数组合并为一个完整数组unnest(...):把合并后的数组拆分成单独的行记录WHERE ... IS NOT NULL:过滤掉数组中的空元素SELECT DISTINCT:去除重复的元素ARRAY(...):把去重后的行重新聚合为数组
更简洁的PostgreSQL 9.5+方案
如果你的PostgreSQL版本在9.5及以上,可以用array_agg结合横向连接实现更简洁的写法,还能顺便给数组元素排序:
SELECT varchar_col, array_agg(DISTINCT elem ORDER BY elem) AS merged_unique_array FROM your_table, unnest(array_cat(COALESCE(array_col1, '{}'::INT[]), COALESCE(array_col2, '{}'::INT[]))) AS elem WHERE elem IS NOT NULL GROUP BY varchar_col;
额外优化点:
COALESCE(array_col1, '{}'::INT[]):处理数组列为NULL的情况,将其转为空数组,避免array_cat返回NULLORDER BY elem:让最终数组的元素按顺序排列(可选,根据需求调整)
内容的提问来源于stack exchange,提问作者Harshit Gupta
相关产品推荐
相关产品推荐

