最近一个月使用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类型的更多相关文章

  1. PostgreSQL 数组类型

    PostgreSQL 支持表的字段使用定长或可变长度的一维或多维数组,数组的类型可以是任何数据库内建的类型.用户自定义的类型.枚举类型, 以及组合类型.但目前还不支持 domain 类型. 数组类型的 ...

  2. PostgreSQL TIMESTAMP类型 时间戳

    PostgreSQL 提供两种存储时间戳的数据类型: 不带时区的 TIMESTAMP 和带时区的 TIMESTAMPTZ. TIMESTAMP 数据类型可以同时存储日期和时间,但它不存储时区.这意味着 ...

  3. postgresql数字类型

    postgresql的数据类型很多,也可以使用create type命令创建自定义数据类型,但常用的数据类型是以下三种: l  数字数据类型 l  字符串数据类型 l  日期/时间数据类型 数字数据类 ...

  4. PostgreSQL数组类型应用

    在使用 awk 脚本:数组是一大利器:在很多场景是用数组能处理. 在 python 中,数据类型list:相当于array类型. 在 Oracle 中,对 array 不够友好,感觉像是鸡肋.但是在 ...

  5. postgresql jsonb类型查询

    select * from (select * from ud_order where user_id=10 and status=2unionselect * from ud_order where ...

  6. PostgreSQL字段类型说明

    BIGSERIALSERIAL8 存储自动递增的惟一整数,最多 8 字节. BIT 固定长度的位串. BIT VARYING(n)VARBIT(n) 可变长度的位串,长度为 n 位. BOOLEAN  ...

  7. postgresql自定义类型并返回数组

    转自 https://blog.csdn.net/victor_ww/article/details/44415895 create type custom_data_type as ( id int ...

  8. postgresql 日期类型处理实践

    ---- 日期+1 select date '2018-01-14' + integer '1'; 结果: 2018-01-15 ---- 日期+1 后 转 20180101 日期字符串 select ...

  9. postgresql —— 数组类型

    创建数组 CREATE TABLE sal_emp ( name text, pay_by_quarter integer[] --还可以定义为integer[4]或integer ARRAY[4] ...

随机推荐

  1. python接口自动化测试二:常用操作

    url = '接口地址' r = requests.get(url)                      # 发送get请求 print(r.status_code)               ...

  2. 兼容IE8以下,获取className节点的元素(document.getElementsByClassName()兼容写法)。

    因为ie8一下不兼容                 document.getElementsByClassName()                 功能:通过class的名字获取符合条件的元素 ...

  3. MySQL5.6 GTID Replication

    MySQL 5.6 的新特性之一,是加入了全局事务 ID (Global Transaction ID) 来强化数据库的主备一致性,故障恢复,以及容错能力.官方文档:http://dev.mysql. ...

  4. Oracle学习笔记--第3章 使用sql*plus工具

    使用sql*plus工具 1.sqlplus连接方式示例 sqlplus system/123[as sysdba]; 2.查看表结构命令;desc[ribe] e.g.      desc scot ...

  5. Android APN

    https://www.cnblogs.com/sishuiliuyun/p/3754516.html android系统把所有的APN都保存在数据库中,数据库绝对路径:/data/data/com. ...

  6. C#之app.config、exe.config和vshost.exe.config作用区别

    vshost.exe.config是程序运行时的配置文本 exe.config是程序运行后会复制到vshost.exe.config app.config是在vshost.exe.config和exe ...

  7. socket.shutdownOutput()方法

    我在用客户端给服务端发报文的时候,一开始客户端没有调用这个方法,结果服务端使用SAX解析报文的时候,public void endDocument() throws SAXException总是得不到 ...

  8. BZOJ1090 [SCOI2003]字符串折叠 区间动态规划 字符串

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1090 题意概括 折叠的定义如下: 1. 一个字符串可以看成它自身的折叠.记作S 2. X(S)是X ...

  9. Linux proc目录下 几个系统文件下的各项参数 (cpuinfo,uptime,meminfo,stat,loadavg)

    参考链接: Linux 操作系统内核基本实验.pdf http://max.book118.com/html/2015/0919/25787869.shtm Linux下cpuinfo文件各项参数的详 ...

  10. shell scripts 之 代码量统计

    代码统计1 文件only中的内容为多个文件的文件名,code如下: xargs说明:xargs 读入stdin的值, 并默认以空白或者回车作为分隔符,将分割的值作为参数传给后面紧接着的的命令行操作.- ...