postgresql中的ltree类型使用方法

postgresql有很多比较妖的数据类型,ltree算一个。

简介

ltree是Postgresql的一个扩展类型 http://www.sai.msu.su/~megera...,在解决树形结构的数据存储上使用。

查看是否安装了插件

select * from pg_extension where extname = 'ltree';

定义

字段的格式为:L1.L2.L3.L4.L5.L6.....

标签是一系列字母数字字符和下划线A-Za-z0-9_, 标签长度必须小于256个字节。标签路径是由点分隔的零个或多个标签的序列,例如L1.L2.L3,表示从分层树的根到特定节点的路径。 标签路径的长度必须小于65Kb,但最好保持在2Kb以下。

查询

创建临时表:

create table tmp.ltree_table(name varchar, path ltree);

写入测试数据

insert into tmp.ltree_table values ('小明','北京.东城.小明');
insert into tmp.ltree_table values ('小刚','北京.西城.小刚');
insert into tmp.ltree_table values ('小红','北京.南城.小红');
insert into tmp.ltree_table values ('小小明','北京.东城.小明.小小明');
insert into tmp.ltree_table values ('小明明','北京.东城.小明.小明明');
insert into tmp.ltree_table values ('小小红','北京.东城.小红.小小红');
insert into tmp.ltree_table values ('小红红','北京.东城.小红.小红红');

查询写入的数据

小明   | 北京.东城.小明
 小刚   | 北京.西城.小刚
 小红   | 北京.南城.小红
 小小明 | 北京.东城.小明.小小明
 小明明 | 北京.东城.小明.小明明
 小小红 | 北京.南城.小红.小小红
 小红红 | 北京.南城.小红.小红红

结构树如下:

查询所有的人和他的孩子的对应关系:

select c.name, s.name from tmp.ltree_table s join (select path ,name from tmp.ltree_table ) c on s.path <@ c.path and s.name <> c.name;

小明 | 小小明
 小明 | 小明明
 小红 | 小小红
 小红 | 小红红

查询覆盖的所有的区域:

select subltree(path,1,2) from tmp.ltree_table;

东城
 西城
 南城
 东城
 东城
 南城
 南城

查询所有南城的人:

select distinct s.name from tmp.ltree_table s where subltree(s.path,1,2) = '南城';

小小红
 小红红
 小红

查询路径长度:

select s.name,nlevel(s.path) from tmp.ltree_table s;

小明   |      3
 小刚   |      3
 小红   |      3
 小小明 |      4
 小明明 |      4
 小小红 |      4
 小红红 |      4

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • postgresql中的ltree类型使用方法

    postgresql有很多比较妖的数据类型,ltree算一个. 简介 ltree是Postgresql的一个扩展类型 http://www.sai.msu.su/~megera...,在解决树形结构的数据存储上使用. 查看是否安装了插件 select * from pg_extension where extname = 'ltree'; 定义 字段的格式为:L1.L2.L3.L4.L5.L6..... 标签是一系列字母数字字符和下划线A-Za-z0-9_, 标签长度必须小于256个字节.标签路

  • 在PostgreSQL中使用ltree处理层次结构数据的方法

    在本文中,我们将学习如何使用PostgreSQL的ltree模块,该模块允许以分层的树状结构存储数据. 什么是ltree? Ltree是PostgreSQL模块.它实现了一种数据类型ltree,用于表示存储在分层树状结构中的数据的标签.提供了用于搜索标签树的广泛工具. 为什么选择ltree? ltree实现了一个物化路径,对于INSERT / UPDATE / DELETE来说非常快,而对于SELECT操作则较快 通常,它比使用经常需要重新计算分支的递归CTE或递归函数要快 如内置的查询语法和专

  • 在PostgreSQL中使用日期类型时一些需要注意的地方

    当我们这些使用Rails的人看到例如5.weeks.from_nowor3.days.ago + 2.hours时并不会感到惊讶.同样,PostgreSQL也可以做到,你可以通过简单调用PostgreSQL内置函数来实现相同的功能. 当前时间/日期/时间戳 获取当前时间的方式有很多种,在这之前我们需要知道以下两种类型的区别: 总是返回当前的值 (clock_timestamp()) 总是返回当前值,但在事务中它返回的是事务开始的时间(now()) 让我们看下面这个例子 postgres=# BE

  • PostgreSQL中关闭死锁进程的方法

    由于使用的PostgreSQL数据库,没有资料.只好进行谷歌. 最终在一个英文论坛中发现了解决方法. 如下: 1.检索出死锁进程的ID 复制代码 代码如下: SELECT * FROM pg_stat_activity WHERE datname='死锁的数据库ID '; 检索出来的字段中,[wating ]字段,数据为t的那条,就是死锁的进程.找到对应的[procpid ]列的值. 2.将进程杀掉 复制代码 代码如下: SELECT pg_cancel_backend('死锁那条数据的proc

  • 介绍PostgreSQL中的Lateral类型

    PostgreSQL 9.3 用了一种新的联合类型! Lateral联合的推出比较低调,但它实现了之前需要使用编写程序才能获得的强大的新查询. 在本文中, 我将会介绍一个在 PostgreSQL 9.2 不可能被实现的渠道转换分析. 什么是 LATERAL 联合? 对此的最佳描述在文档中 可选 FROM 语句清单 的底部: LATERAL 关键词可以在前缀一个 SELECT FROM 子项. 这能让 SELECT 子项在FROM项出现之前就引用到FROM项中的列. (没有 LATERAL 的话,

  • 介绍PostgreSQL中的范围类型特性

    PostgreSQL 9.2 的一项新特性就是范围类型 range types,通过这个名字你可以轻松猜出该类型的用途,它可让你为某列数据定义数值范围. 这个简单的特性可以让我们不需要定义两个字段来描述数值的开始值和结束值,一个最直观的例子就是: postgres# CREATE TABLE salary_grid (id int, position_name text, start_salary int, end_salary int); CREATE TABLE postgres# INSE

  • ASP.NET Core中Startup类、Configure()方法及中间件详解

    ASP.NET Core 程序启动过程如下 1, Startup 类 ASP.NET Core 应用使用Startup类,按照约定命名为Startup.Startup类: 可选择性地包括ConfigureServices方法以配置应用的服务. 必须包括Configure方法以创建应用的请求处理管道. 当应用启动时,运行时调用ConfigureServices和Configure . Startup 方法体如下 public class Startup { // 使用此方法向容器添加服务 publ

  • Java postgresql数组字段类型处理方法详解

    在实际开发中遇到postgresql中定义的数组字段,下面解决两个问题,如何定义数组字段的默认值为空格数组,以及如何再java实体类中直接使用数组对象接受数据或把数据存入数据库. 1.在postgresql中定义数组对象及默认值 以字符串你数组为例: 比如一个字段用于存储多张图片的url,可以使用一下sql定义 pictures _varchar NOT NUll default ARRAY[]::character varying[] 2.实体类存入数组到数据库并接受数据库的数组数据 直接定义

  • xpath的数据和节点类型以及XPath中节点匹配的基本方法

    XPath数据类型 XPath可分为四种数据类型: 节点集(node-set) 节点集是通过路径匹配返回的符合条件的一组节点的集合.其它类型的数据不能转换为节点集. 布尔值(boolean) 由函数或布尔表达式返回的条件匹配值,与一般语言中的布尔值相同,有true和 false两个值.布尔值可以和数值类型.字符串类型相互转换. 字符串(string) 字符串即包含一系列字符的集合,XPath中提供了一系列的字符串函数.字符串可与数值类型.布尔值类型的数据相互转换. 数值(number) 在XPa

  • JavaScript中判断对象类型的几种方法总结

    我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一个说明运算数类型的字符串.如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在). 但 type

随机推荐