最近一个月使用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. 字符串反转,例如"abc"反转"cba"

    package stringyiwen; /* * 字符串反转,例如"abc"反转"cba" */public class StringTestChar { p ...

  2. 打开MSSQL 2008 R2的时候,展开数据库都显示以下的错误提示: 值不能为空。参数名viewinfo(microsoft.sqlserver.management.sqlstudio.explorer)

    打开MSSQL 2008 R2的时候,展开数据库都显示以下的错误提示: 值不能为空.参数名viewinfo(microsoft.sqlserver.management.sqlstudio.explo ...

  3. Spring Boot自动扫描

    进行Spring Boot和Mybatis进行整合的时候,Spring Boot注解扫描的时候无法扫描到Application类的以外的包下面的注解,如下图: App就是Application类,下图 ...

  4. Springboot 2.0 - 集成redis

    序 最近在入门SpringBoot,然后在感慨 SpringBoot较于Spring真的方便多时,顺便记录下自己在集成redis时的一些想法. 1.从springboot官网查看redis的依赖包 & ...

  5. contenteditable="true"让div可编辑

    今天才知道有这个属性,真是out了. 不过以前一直没做编辑器有关的,毕竟开源的很多. 现在觉得开源的也不是这么好用,自己写写简单的吧 用了 <div class="content-bo ...

  6. day8--socketserver回顾

    sockeserver主要实现多并发的情况,我们知道,socket只能一对一用户进行交互,如何实现一对多交互,socketserver就是用来解决这个问题的. socketserver--共有这么几种 ...

  7. java:给你一个数组和两个索引,交换下标为这两个索引的数字

    给你一个数组和两个索引,交换下标为这两个索引的数字 import java.util.Arrays; public class Solution { public static void main(S ...

  8. 洛谷2973 [USACO10HOL]赶小猪Driving Out the Piggi… 概率 高斯消元

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - 洛谷2973 题意概括 有N个城市,M条双向道路组成的地图,城市标号为1到N.“西瓜炸弹”放在1号城市,保证城 ...

  9. P2700 逐个击破 最小生成树

    题目描述 现在有N个城市,其中K个被敌方军团占领了,N个城市间有N-1条公路相连,破坏其中某条公路的代价是已知的,现在,告诉你K个敌方军团所在的城市,以及所有公路破坏的代价,请你算出花费最少的代价将这 ...

  10. 【Java】 剑指offer(50-2) 字符流中第一个只出现一次的字符

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字 ...