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 |
extnamespace |
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)
postgresql ltree类型的更多相关文章
- PostgreSQL 数组类型
PostgreSQL 支持表的字段使用定长或可变长度的一维或多维数组,数组的类型可以是任何数据库内建的类型.用户自定义的类型.枚举类型, 以及组合类型.但目前还不支持 domain 类型. 数组类型的 ...
- PostgreSQL TIMESTAMP类型 时间戳
PostgreSQL 提供两种存储时间戳的数据类型: 不带时区的 TIMESTAMP 和带时区的 TIMESTAMPTZ. TIMESTAMP 数据类型可以同时存储日期和时间,但它不存储时区.这意味着 ...
- postgresql数字类型
postgresql的数据类型很多,也可以使用create type命令创建自定义数据类型,但常用的数据类型是以下三种: l 数字数据类型 l 字符串数据类型 l 日期/时间数据类型 数字数据类 ...
- PostgreSQL数组类型应用
在使用 awk 脚本:数组是一大利器:在很多场景是用数组能处理. 在 python 中,数据类型list:相当于array类型. 在 Oracle 中,对 array 不够友好,感觉像是鸡肋.但是在 ...
- postgresql jsonb类型查询
select * from (select * from ud_order where user_id=10 and status=2unionselect * from ud_order where ...
- PostgreSQL字段类型说明
BIGSERIALSERIAL8 存储自动递增的惟一整数,最多 8 字节. BIT 固定长度的位串. BIT VARYING(n)VARBIT(n) 可变长度的位串,长度为 n 位. BOOLEAN ...
- postgresql自定义类型并返回数组
转自 https://blog.csdn.net/victor_ww/article/details/44415895 create type custom_data_type as ( id int ...
- postgresql 日期类型处理实践
---- 日期+1 select date '2018-01-14' + integer '1'; 结果: 2018-01-15 ---- 日期+1 后 转 20180101 日期字符串 select ...
- postgresql —— 数组类型
创建数组 CREATE TABLE sal_emp ( name text, pay_by_quarter integer[] --还可以定义为integer[4]或integer ARRAY[4] ...
随机推荐
- Promise in Chakra
http://www.ecma-international.org/ecma-262/#sec-fulfillpromise 25.4.1.3.1 and 25.4.1.3.2 Promise Rej ...
- DDD领域模型查询方法实现(八)
在DDD.Domain工程文件夹Repository下创建RequestPage类: public class RequestPage { public RequestPage(int pagesiz ...
- 内连接,外链接(左连接、右连接、全连接),交叉连接大总结+附SQL JOINS图解[转]
1.什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据. 目的:实现多个表查询操作. 2.分类: 首先划分一下,连接分为三种:内连接.外连接.交叉连接 内连接(INNER ...
- 《LINQ技术详解C#》-2.查询表达式翻译为标准查询操作符
(1)透明标识符 有些翻译步骤要使用透明标识符(*)插入枚举变量. 透明标识符只在翻译过程中存在,翻译结束将不再出现. (2)翻译步骤 ①带有into连续语句的Select和Group语句 from. ...
- ElasticSearch - How to search for a part of a word with ElasticSearch
Search a part of word with ElasticSearch 来自stackoverflow https://stackoverflow.com/questions/6467067 ...
- python中的面相对象
1.常用术语 2.创建类 empCount 变量是一个类变量,它的值将在这个类的所有实例之间共享.你可以在内部类或外部类使用 Employee.empCount 访问. 第一种方法__init__() ...
- python爬虫学习(一):BeautifulSoup库基础及一般元素提取方法
最近在看爬虫相关的东西,一方面是兴趣,另一方面也是借学习爬虫练习python的使用,推荐一个很好的入门教程:中国大学MOOC的<python网络爬虫与信息提取>,是由北京理工的副教授嵩天老 ...
- 不一样的go语言-一样的语法
前言 上一篇入门篇算是初识庐山真面目,我们知道了一个go程序的构成,在这里总结一下. //包名 package //导入包 import "fmt" //main方法,程序入口 ...
- MySQL数据库crash的问题分析
[问题] 生产环境有多台slave服务器,不定期的会crash,下面是error log中的堆栈信息 Thread pointer: 0x7f1e54b26410 Attempting backtra ...
- mvc返回多个结果集,返回多个视图
System.Web.Mvc.ViewPage<dynamic> public ActionResult Index() { IDictionary< ...
