postgresql ltree類型


  最近一個月使用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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM