在postgres和duckdb中比较两个数组并只挑选不匹配的元素

直接用-运算符是不行的, 网上用AI生成的文档很不负责地误导大家。

复制代码
select array[1,2]-array[1];
错误:  操作符不存在: integer[] - integer[]
第1行select array[1,2]-array[1];
                      ^
提示:  没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换.

duckdb 也会报错

复制代码
select [1,2] -[1];
Binder Error:
No function matches the given name and argument types '-(INTEGER[], INTEGER[])'. You might need to add explicit type casts.

文档中有array_remove函数,但一次只能删除一个元素

复制代码
postgres=# select array_remove(ARRAY[1,2,3,2], 2);
 array_remove
--------------
 {1,3}

还是人类的回答靠谱, 将数组转成表的行,再用array()函数转回来。

复制代码
postgres=# select unnest(array[1,2,3]) except select unnest(array[1,2]);
 unnest
--------
      3
(1 行记录)

postgres=# select array(select unnest(array[1,2,3]) except select unnest(array[1,2]));
 array
-------
 {3}
(1 行记录)

此法在duckdb也可以用

复制代码
select array(select unnest(array[1,2,3]) except select unnest(array[1,2]));
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ (SELECT CASE  WHEN ((array_agg(COLUMNS(*)) IS NULL)) THEN (list_value()) ELSE array_agg(COLUMNS(*)) END FROM ((SEL...  │
│                                                       int32[]                                                        │
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ [3]                                                                                                                  │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

除了上面的方法,duckdb还可以用list_filter配合contains函数。

复制代码
select list_filter([3, 4, 5], lambda x : not contains([2,4],x  ));
┌─────────────────────────────────────────────────────────────────────────────────────────────┐
│ list_filter(main.list_value(3, 4, 5), (lambda x: (NOT contains(main.list_value(2, 4), x)))) │
│                                           int32[]                                           │
├─────────────────────────────────────────────────────────────────────────────────────────────┤
│ [3, 5]                                                                                      │
└─────────────────────────────────────────────────────────────────────────────────────────────┘
相关推荐
围炉聊科技2 小时前
长期免费的数据库方案——零成本基建系列
数据库
AC赳赳老秦3 小时前
公开图片 OCR 数据提取:OpenClaw 合规采集公开信息图,识别文字与表格并转化为结构化数据
java·大数据·前端·数据库·python·php·openclaw
bransyin3 小时前
一个 SQL 字段到底是怎么算出来的?我做了一个能给出“证据”的血缘工具
大数据·sql·ai·血缘
梁辰兴4 小时前
软件工程:数据结构设计
数据库·软件工程·设计原则·设计方法·梁辰兴·数据库结构设计·数据库结构类型
AC赳赳老秦5 小时前
风控岗应用:OpenClaw 采集公开司法与经营异常数据,自动生成企业风险评估报告
大数据·c语言·数据库·人工智能·python·php·openclaw
灯澜忆梦5 小时前
【MySQL18】进阶篇 | MySQL管理
数据库·mysql
zcmodeltech6 小时前
智能制造教学实训沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的工业机器人-智慧工厂-数字孪生全场景联动方案
数据库·stm32·嵌入式硬件·机器人·制造·多分类
求索实验室6 小时前
1368次实验证明:PostgreSQL对数据倾斜的基数估计无解——我的AI4S参赛实录
postgresql·ai编程
AI多Agent协作实战派6 小时前
AI多Agent协作系统实战(四十):AI说“没有错误“,系统判了“测试失败“——一个正则的误判
数据库·人工智能
隔窗听雨眠7 小时前
OceanBase接入DeepSeek:数据库与AI的深度融合如何改写企业数据规则
数据库·人工智能·oceanbase