PostgreSQL 使用数组类型及mybatis操作数组类型
为啥要用到数组类型呢?因为ES支持数组类型,为了迁移遍历,所以也支持数组类型。
select docid,authors from search_doc_new_ic where authors @>'{"惠普"}' limit 10; docid |authors | --------------------------------+---------------+ cc88a182e84f4ab2a976abe1cbba0b41|{王玮嘉,惠普,黄波,环保Ⅱ}| c3826da7a322490296ec9c5901ba353a|{王玮嘉,惠普,黄波} | fc4f63dec47b4facb8216d8b29d9918a|{王玮嘉,惠普,黄波} | 863afb11385848c9a8a7c5df51024532|{王玮嘉,惠普,黄波,环保Ⅱ}| fdc0562295304045b5c7ce940f96d56b|{王玮嘉,惠普,黄波,环保Ⅱ}| 6073e0de9b2747359c9b02e9bf0a9c2b|{王玮嘉,惠普,黄波} | facc9518c75148da8b079fde64f47691|{王玮嘉,惠普,黄波} | 7c587a6337aa40c3acdbe7e363575317|{王玮嘉,惠普,黄波} | dcf807b2b0cc477ca7919cc41d9f5331|{王玮嘉,惠普,黄波} | 631c4dd57afa40a694be1720e1b4a865|{王玮嘉,惠普,黄波} |
SELECT * FROM sal_emp; name |pay_by_quarter |schedule | -----+-------------------------+-----------------------------------------+ Bill |{10000,10000,10000,10000}|{{meeting,lunch},{training,presentation}}| Carol|{20000,25000,25000,25000}|{{breakfast,consulting},{meeting,lunch}} |
SELECT * FROM sal_emp where 15000 < any (pay_by_quarter); -- 查询pay_by_quarter数组中任何一个元素都大于15000 name |pay_by_quarter |schedule | -----+-------------------------+----------------------------------------+ Carol|{20000,25000,25000,25000}|{{breakfast,consulting},{meeting,lunch}}|
SELECT * FROM sal_emp where 22500 > ALL (pay_by_quarter); -- 查询pay_by_quarter数组中任何一个元素都小于22500 name|pay_by_quarter |schedule | ----+-------------------------+-----------------------------------------+ Bill|{10000,10000,10000,10000}|{{meeting,lunch},{training,presentation}}|
SELECT * FROM sal_emp where array_to_string(schedule,',') like '%sult%'; -- 数组模糊查询 name |pay_by_quarter |schedule | -----+-------------------------+----------------------------------------+ Carol|{20000,25000,25000,25000}|{{breakfast,consulting},{meeting,lunch}}|
访问JSON中的数组
create table test_ft(id int4,arry VARCHAR[],content1 jsonb,body text); insert into test_ft values(1,ARRAY [ 'x', 'y' ],'{ "guid": "9c36adc1-7fb5-4d5b-83b4-90356a46balabala", "name": "james", "is_active": true, "company": "Oracle", "address": "178 Howard Place, Gulf, Washington, 702", "registered": "2009-11-07T08:53:22 +08:00", "latitude": 19.793713, "longitude": 86.513373, "tags": [ "enim", "aliquip", "qui" ]}','postgresql支持两种json数据类型:json和jsonb,而两者唯一的区别在于效率,json是对输入的完整拷贝,使用时再去解析,所以它会保留输入的空格,重复键以及顺序等。而jsonb是解析输入后保存的二进制,它在解析时会删除不必要的空格和重复的键,顺序和输入可能也不相同。使用时不用再次解析。两者对重复键的处理都是保留最后一个键值对。效率的差别:json类型存储快,使用慢,jsonb类型存储稍慢,使用较快。');
select id,arry, content1->'name',substr(body,1,100) from test_ft t where t.arry @>'{"x"}' and t.content1 @>'{"name":"james"}' and t.content1->'tags'->>1='aliquip' -- 访问content1 JSON中tags数组元素的第一个值
java到pg array类型的映射参见https://www.2ndquadrant.com/en/blog/using-java-arrays-to-insert-retrieve-update-postgresql-arrays/
https://www.postgresql.org/docs/current/functions-array.html
https://www.jb51.cc/postgresql/192881.html 为什么数组在c函数中比plpgsql函数中快很多。
https://www.appsloveworld.com/postgresql/100/152/how-to-insert-an-array-value-to-postgresql-with-mybatis mybatis本身并不支持pg的数组类型,通过typehandler可以实现任意类型的支持与扩张。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2019-09-13 vmware vsphere各版本差别,及各套件差别
2019-09-13 oracle/mysql/lightdb/postgresql java jdbc类型映射