PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.11. 几何函数和操作符

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 9.11. 几何函数和操作符 几何类型point、box、 lseg、line、path、 polygon和circle有一大堆本地支持函数和操作符,如表 9.33、表 9.34和表 9.35中所示。

9.11. 几何函数和操作符

几何类型pointbox、 lseglinepath、 polygoncircle有一大堆本地支持函数和操作符,如表 9.33表 9.34表 9.35中所示。

小心

请注意same as操作符(~=),表示pointboxpolygoncircle类型的一般相等概念。这些类型中的某些还有一个=操作符,但是=只比较相同的面积。其它的标量比较操作符 (<=等等)也是为这些类型比较面积。

表 9.33. 几何操作符

操作符 描述 例子
+ 平移 box '((0,0),(1,1))' + point '(2.0,0)'
- 平移 box '((0,0),(1,1))' - point '(2.0,0)'
* 缩放/旋转 box '((0,0),(1,1))' * point '(2.0,0)'
/ 缩放/旋转 box '((0,0),(2,2))' / point '(2.0,0)'
# 相交的点或方框 box '((1,-1),(-1,1))' # box '((1,1),(-2,-2))'
# 路径或多边形中的点数 # path '((1,0),(0,1),(-1,0))'
@-@ 长度或周长 @-@ path '((0,0),(1,0))'
@@ 中心 @@ circle '((0,0),10)'
## 第二个操作数上最接近第一个操作数的点 point '(0,0)' ## lseg '((2,0),(0,2))'
<-> 距离 circle '((0,0),1)' <-> circle '((5,0),1)'
&& 是否重叠?(只要有一个公共点这就为真) box '((0,0),(1,1))' && box '((0,0),(2,2))'
<< 是否严格地在左侧? circle '((0,0),1)' << circle '((5,0),1)'
>> 是否严格地在右侧? circle '((5,0),1)' >> circle '((0,0),1)'
&< 没有延展到右边? box '((0,0),(1,1))' &< box '((0,0),(2,2))'
&> 没有延展到左边? box '((0,0),(3,3))' &> box '((0,0),(2,2))'
<<| 严格在下? box '((0,0),(3,3))' <<| box '((3,4),(5,5))'
|>> 严格在上? box '((3,4),(5,5))' |>> box '((0,0),(3,3))'
&<| 没有延展到上面? box '((0,0),(1,1))' &<| box '((0,0),(2,2))'
|&> 没有延展到下面? box '((0,0),(3,3))' |&> box '((0,0),(2,2))'
<^ 在下面(允许相切)? circle '((0,0),1)' <^ circle '((0,5),1)'
>^ 在上面(允许相切)? circle '((0,5),1)' >^ circle '((0,0),1)'
?# 相交? lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))'
?- 水平? ?- lseg '((-1,0),(1,0))'
?- 水平对齐? point '(1,0)' ?- point '(0,0)'
?| 垂直? ?| lseg '((-1,0),(1,0))'
?| 垂直对齐? point '(0,1)' ?| point '(0,0)'
?-| 相互垂直? lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))'
?|| 平行? lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))'
@> 包含? circle '((0,0),2)' @> point '(1,1)'
<@ 包含在内或在上? point '(1,1)' <@ circle '((0,0),2)'
~= 相同? polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))'

注意

PostgreSQL之前,包含操作符@><@被分别称为~@。 这些名字仍然可以使用,但是已被废除并且最终将被移除。

表 9.34. 几何函数

函数 返回类型 描述 例子
area(object) double precision 面积 area(box '((0,0),(1,1))')
center(object) point 中心 center(box '((0,0),(1,2))')
diameter(circle) double precision 圆的直径 diameter(circle '((0,0),2.0)')
height(box) double precision 方框的垂直尺寸 height(box '((0,0),(1,1))')
isclosed(path) boolean 一个封闭路径? isclosed(path '((0,0),(1,1),(2,0))')
isopen(path) boolean 一个开放路径? isopen(path '[(0,0),(1,1),(2,0)]')
length(object) double precision 长度 length(path '((-1,0),(1,0))')
npoints(path) int 点数 npoints(path '[(0,0),(1,1),(2,0)]')
npoints(polygon) int 点数 npoints(polygon '((1,1),(0,0))')
pclose(path) path 将路径转换成封闭的 pclose(path '[(0,0),(1,1),(2,0)]')
popen(path) path 将路径转换成开放 popen(path '((0,0),(1,1),(2,0))')
radius(circle) double precision 圆的半径 radius(circle '((0,0),2.0)')
width(box) double precision 方框的水平尺寸 width(box '((0,0),(1,1))')

表 9.35. 几何类型转换函数

函数 返回类型 描述 例子
box(circle) box 圆到方框 box(circle '((0,0),2.0)')
box(point) box 点到空方框 box(point '(0,0)')
box(pointpoint) box 点到方框 box(point '(0,0)', point '(1,1)')
box(polygon) box 多边形到方框 box(polygon '((0,0),(1,1),(2,0))')
bound_box(boxbox) box 盒到边界框 bound_box(box '((0,0),(1,1))', box '((3,3),(4,4))')
circle(box) circle 方框到圆 circle(box '((0,0),(1,1))')
circle(pointdouble precision) circle 中心和半径到圆 circle(point '(0,0)', 2.0)
circle(polygon) circle 多边形到圆 circle(polygon '((0,0),(1,1),(2,0))')
line(pointpoint) line 点到线 line(point '(-1,0)', point '(1,0)')
lseg(box) lseg 方框对角线到线段 lseg(box '((-1,0),(1,0))')
lseg(pointpoint) lseg 点到线段 lseg(point '(-1,0)', point '(1,0)')
path(polygon) path 多边形到路径 path(polygon '((0,0),(1,1),(2,0))')
point(double precisiondouble precision) point 构造点 point(23.4, -44.5)
point(box) point 方框的中心 point(box '((-1,0),(1,0))')
point(circle) point 圆的中心 point(circle '((0,0),2.0)')
point(lseg) point 线段的中心 point(lseg '((-1,0),(1,0))')
point(polygon) point 多边形的中心 point(polygon '((0,0),(1,1),(2,0))')
polygon(box) polygon 方框到4点多边形 polygon(box '((0,0),(1,1))')
polygon(circle) polygon 圆到12点多边形 polygon(circle '((0,0),2.0)')
polygon(nptscircle) polygon 点到npts点多边形 polygon(12, circle '((0,0),2.0)')
polygon(path) polygon 路径到多边形 polygon(path '((0,0),(1,1),(2,0))')

我们可以把一个point的两个组成数字当作具有索引 0 和 1 的数组访问。例如,如果t.p是一个point列,那么SELECT p[0] FROM t检索 X 座标而 UPDATE t SET p[1] = ...改变 Y 座标。同样,box或者lseg类型的值可以当作两个point值的数组值看待。

函数area可以用于类型boxcirclepatharea函数操作path数据类型的时候, 只有在path的点没有交叉的情况下才可用。例如,path '((0,0),(0,1),(2,1),(2,2),(1,2),(1,0),(0,0))'::PATH是不行的, 而下面的视觉上相同的 path '((0,0),(0,1),(1,1),(1,2),(2,2),(2,1),(1,1),(1,0),(0,0))'::PATH就可以。 如果交叉和不交叉的path概念让你疑惑,那么把上面两个path都画在一张图纸上,你就明白了。

本文转自PostgreSQL中文社区,原文链接:9.11. 几何函数和操作符

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
2月前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
3月前
|
SQL 存储 关系型数据库
PostgreSQL核心之SQL基础学习
PostgreSQL核心之SQL基础学习
45 3
|
3月前
|
SQL 安全 关系型数据库
PostgreSQL SQL注入漏洞(CVE-2018-10915)--处理
【8月更文挑战第8天】漏洞描述:PostgreSQL是一款自由的对象关系型数据库管理系统,支持多种SQL标准及特性。存在SQL注入漏洞,源于应用未有效验证外部输入的SQL语句,允许攻击者执行非法命令。受影响版本包括10.5及更早版本等。解决方法为升级PostgreSQL
256 2
|
3月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
364 0
|
4月前
|
SQL 数据库
SQL BETWEEN 操作符
【7月更文挑战第14天】SQL BETWEEN 操作符。
42 10
|
4月前
|
SQL 数据库
SQL BETWEEN 操作符
【7月更文挑战第15天】SQL BETWEEN 操作符。
33 3
|
SQL 关系型数据库 MySQL
SQL 手册-实用 SQL 语句-跨Schema
PolarDB-X 1.0实例中通常有多个Schema,PolarDB-X 1.0支持通过SQL语法进行跨Schema的查询,效果与MySQL的跨Schema查询类似。
640 0
|
2月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
4月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
111 13
|
4月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。