最近一个月使用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. 性能测试四十:Mysql存储过程造数据

    性能测试是基于大量数据的,而进行性能测试之前肯定没那么多数据,所以就要自己准备数据 数据构造方法: 1.业务接口 -- 适合数据表关系复杂 -- 优点:数据完整性比较好2.存储过程 -- 适合表数量少 ...

  2. JS高级 - 面向对象5(继承,引用)

    <script type="text/javascript"> //------------------Person类 //(Person)的构造函数 function ...

  3. 【Java】 剑指offer(43) 从1到n整数中1出现的次数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例 ...

  4. routing路由模式

    一:介绍 1.模式 2.应用场景 如果exchangge与队列中的key相同,消息就发送过去. 这个就是需要将交换机与队列增加key. 3.路由类型 上节课的订阅模式中的路由类型是Fanout. 这篇 ...

  5. 008 Spark中standalone模式的HA(了解,知道怎么配置即可)

    standalone也存在单节点问题,这里主要是配置两个master. 1.官网 2.具体的配置 3.配置方式一(不是太理想) 这种知识基于未来可以重启,但是不能在宕机的时候提供服务. 方式一:Sin ...

  6. Unity 之 添加背景音乐 以及 Slider控制

    游戏音频分为背景音乐与环境音乐两种.Audio   Clip(音频剪辑)有四种音乐格式.MP3:适合较长音频,作为背景音乐.Ogg:适合较长音频,作为背景音乐.Wav:适合较短音频,作为环境音乐.Ai ...

  7. Brute-Force算法

    #include <iostream> #include <string> using namespace std; int BF(const string& fath ...

  8. C# 反编译破解软件方法

    我们有时在使用一些小工具软件时,会提示购买License(注册码之类的东东)后才能正常使用.在这里我们来尝试直接绕过License验证直接使用软件,实现简单的软件破解. 主要实现方式: 通过反编译工具 ...

  9. hdu 6185 递推+【矩阵快速幂】

    <题目链接> <转载于 >>> > 题目大意: 让你用1*2规格的地毯去铺4*n规格的地面,告诉你n,问有多少种不同的方案使得地面恰好被铺满且地毯不重叠.答案 ...

  10. hdu1003 Max Sum【最大连续子序列之和】

    题目链接:https://vjudge.net/problem/HDU-1003 题目大意:给出一段序列,求出最大连续子序列之和,以及给出这段子序列的起点和终点. 解题思路:最长连续子序列之和问题其实 ...