最近一個月使用Postgresql的時候,經常遇到ltree的數據,感覺有些別扭,可是有繞不過去。今天決心整理一下,以后使用方便一些。
一、簡介
ltree是Postgresql的一個擴展類型,由兩位國外PostgreSQL貢獻者共同開發。網址如下:http://www.sai.msu.su/~megera/postgres/gist
二、目的
開發這個類型的目的是為了解決復雜的樹狀模型相關問題,如圖:

也是這個網址提到的內容:http://blog.163.com/digoal@126/blog/static/163877040201132843255911/
三、詳解
3.1 是否安裝ltree
執行sql:select * from pg_extension where extname = 'ltree';
extname | ltree extowner | 10 extnamespace | 2200 extrelocatable | t extversion | 1.0 extconfig | extcondition |
如果沒有安裝,參考網站:http://blog.163.com/digoal@126/blog/static/1638770402011427104710922/
3.2 定義
ltree是由標簽和分隔符組成的字符串,比如:L1.L2.L3
- 分隔符:一般是小數點
- 標簽:目前支持由A-Za-z0-9_組成字符串
- 路徑:標簽本身也是路徑
- lquery:可以理解為一個搜索ltree的正則表達式,例如:*.test.*,表示任何包含test標簽的路徑
- ltxtquery:同上,一般用於全文掃描。
四、操作符
- ltree @> ltree 左手邊參數是右手邊的祖先(或者平輩)嗎?
-
select * from mirror.sight where area_path <@ (select area_path from mirror.sight where name = '加利福尼亞州') and type = '城市'

- ltree <@ ltree 左手邊參數是右手邊的后代(或者平輩)嗎?
- ltree ~ lquery ltree 匹配 lquery 嗎?
- lquery ~ ltree ltree 匹配 lquery 嗎?
五、事例
5.1 建立數據表
--在test的schema下面建立測試表 create table test.test(id serial,song ltree not null); --添加音樂信息 insert into test.test (song) values ('GangTai.NanGeShou.LiuDeHua.AiNiYiWanNian'); insert into test.test (song) values ('GangTai.NanGeShou.LiuDeHua.JinTian'); insert into test.test (song) values ('GangTai.NanGeShou.LiuDeHua.WangQinShui'); insert into test.test (song) values ('GangTai.NanGeShou.ZhangXueYou.QingShu'); insert into test.test (song) values ('GangTai.NanGeShou.ZhangXueYou.WenBie'); insert into test.test (song) values ('GangTai.NvGeShou.ZhenXiuWen.MeiFeiSeWu'); insert into test.test (song) values ('GangTai.NvGeShou.ZhenXiuWen.ZhongShenMeiLi'); insert into test.test (song) values ('DaLu.NanGeShou.DaoLang.2002NianDeDiYiChangXue'); insert into test.test (song) values ('DaLu.NvGeShou.FanBinBin.FeiNiao');
5.2 查看信息
5.2.0 數據列表信息
select * from test.test; ********************************************** id | song ----+----------------------------------------------- 1 | GangTai.NanGeShou.LiuDeHua.AiNiYiWanNian 2 | GangTai.NanGeShou.LiuDeHua.WangQinShui 3 | GangTai.NanGeShou.ZhangXueYou.QingShu 4 | GangTai.NanGeShou.ZhangXueYou.WenBie 5 | GangTai.NvGeShou.ZhenXiuWen.MeiFeiSeWu 6 | GangTai.NvGeShou.ZhenXiuWen.ZhongShenMeiLi 7 | DaLu.NanGeShou.DaoLang.2002NianDeDiYiChangXue 8 | DaLu.NvGeShou.FanBinBin.FeiNiao 9 | GangTai.NanGeShou.LiuDehua.JinTian (9 rows)
5.2.1 查看劉德華的所有歌曲
select subltree(song,3,4) from test.test where subltree(song,2,3) = 'LiuDeHua'; ******************************************** subltree --------------- AiNiYiWanNian WangQinShui JinTian
5.2.2 查看與劉德華同一個區域(港台)的歌手
select distinct subltree(song,2,3)
from test.test where song <@ (select subpath(song,0,2) from test.test where subltree(song,2,3)='LiuDeHua' limit 1); ********************************** subltree ------------- LiuDeHua ZhangXueYou
5.2.3 查看港台的所有歌曲
select subltree(song,3,4) from test.test where subltree(song,0,1) = 'GangTai'; *********************** subltree ---------------- AiNiYiWanNian WangQinShui QingShu WenBie MeiFeiSeWu ZhongShenMeiLi JinTian (7 rows)

