PostgreSQL 使用 psql `\do` 命令查询运算符所有重载版本
发布时间:2026/10/8 14:22:16 锦皓数字建站

文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载是 PostgreSQL 中最常见的包含containment运算符之一常用于数组与 JSONB 的包含判断。但当你想知道这个运算符还能用于哪些数据类型、以及每种类型组合的返回结果时手写 SQL 去翻系统目录相当繁琐。本文介绍 psql 元命令\do的用法一条命令即可列出某个运算符在pg_catalog中的全部重载签名并通过对数组、range、JSONB 等实际场景的解析让你彻底掌握运算符重载与类型解析的思路。\do元命令查看运算符的全部签名psql 提供了一系列以反斜杠开头的元命令meta-command其中\do专门用于查询系统中的运算符。它的基本用法是\do 执行后 psql 会从系统目录中找出所有名为的运算符并输出一张结果表List of operators Schema | Name | Left arg type | Right arg type | Result type | Description --------------------------------------------------------------------------- pg_catalog | | aclitem[] | aclitem | boolean | contains pg_catalog | | anyarray | anyarray | boolean | contains pg_catalog | | anyrange | anyelement | boolean | contains pg_catalog | | anyrange | anyrange | boolean | contains pg_catalog | | box | box | boolean | contains pg_catalog | | box | point | boolean | contains pg_catalog | | circle | circle | boolean | contains pg_catalog | | circle | point | boolean | contains pg_catalog | | jsonb | jsonb | boolean | contains pg_catalog | | path | point | boolean | contains pg_catalog | | polygon | point | boolean | contains pg_catalog | | polygon | polygon | boolean | contains pg_catalog | | tsquery | tsquery | boolean | contains这张表的关键在Left arg type左操作数类型与Right arg type右操作数类型两列它们决定了每一种运算符重载可以接受什么样的操作数组合。值得注意的是所有重载的Result type都是boolean这说明包含运算符本质上是返回真/假的谓词predicate。\do的适用面不限于它支持任意运算符。比如想知道不等有多少种重载直接执行\do 即可想查看全表运算符可以不带参数执行\dopsql 会列出当前可见的所有运算符。这也是排查“为什么这个运算符不适用于我的数据类型”最直接的手段如果表中查不到你想要的操作数组合说明该运算符对这对类型没有定义。理解包含运算符的语义表示“包含”contains判断左操作数是否包含右操作数。在仓库笔记 set-inclusion-with-hstore.md 中可以看到它的孪生运算符“被包含于”的用法检查右操作数是否为左操作数的子集则检查左操作数是否为右操作数的子集。 select one1, two2, three3::hstore two2::hstore; ?column? ---------- t select one1, two2, three3::hstore two2::hstore; ?column? ---------- f理解了这个语义再看上面\do 的输出就会豁然开朗表里列出的每一种操作数组合都是“判断左操作数是否包含右操作数”这一语义在不同数据类型上的具体实现。逐类解读的多种重载签名anyarray 与 anyarrayanyarray anyarray是数组包含判断。PostgreSQL 用anyarray作为伪类型pseudo-type来表示“任意数组类型”因此这一个签名就覆盖了int[]、text[]等所有具体数组类型。配合仓库笔记 defining-arrays.md 中定义的数组可以这样验证 select array[a,b,c] array[a,c]; ?column? ---------- t即左数组是否包含右数组的全部元素不要求顺序一致。anyrange 与 anyelement / anyrangeanyrange anyelement判断一个 range 区间是否包含某个元素anyrange anyrange判断一个区间是否完全包含另一个区间。这是范围类型range type专属的重载比如int4range、daterange等都可以直接使用。jsonb 与 jsonbjsonb jsonb是 JSON 路径包含判断左 JSON 中是否包含右 JSON 的整个结构。它是日常业务查询中使用最频繁的重载之一例如存储 JSON 的列里筛选“包含某个嵌套结构”的记录。仓库笔记 extracting-nested-json-data.md 展示了如何用json_extract_path取出嵌套值而则是从相反方向——判断结构包含——来处理 JSONB 数据。几何类型重载box、circle、polygon、path、point几组重载服务于几何数据的空间包含判断box box、circle circle、polygon polygon图形是否包含另一个图形box point、circle point、path point、polygon point图形是否包含某个点。其他类型aclitem[] aclitem判断权限项数组是否包含某个权限项用于 ACL访问控制列表判断tsquery tsquery判断一个全文检索查询是否包含另一个查询服务于全文搜索场景。\do背后的系统目录原理\do之所以能瞬间给出答案是因为 PostgreSQL 把所有运算符的元数据都存放在系统目录表中。从仓库笔记 types-by-category.md 可以看出PostgreSQL 的类型信息存放在pg_type系统目录中而运算符的信息则对应存放在pg_operator目录中——\do本质上是 psql 对pg_operator的封装查询。\do 与如下形式的 SQL 等价select oprname, oprleft, oprright, oprresult from pg_operator where oprname ;这就是为什么\do输出的每一行都对应一条独立的运算符重载定义每个重载在pg_operator中都有一条记录记录着它的左右操作数类型与返回类型。anyarray、anyrange、anyelement这些伪类型意味着该运算符是泛型polymorphic的可以适配任意符合条件的具体类型。使用场景与注意事项排查类型不匹配当一条查询报出 “operator does not exist: ... ...” 错误时用\do 对照检查是否存在你想要的操作数组合往往能立刻定位问题。研究陌生运算符遇到不熟悉的运算符先\do 运算符名看它支持哪些类型再结合语义猜测用途是理解 PostgreSQL 运算符体系的捷径。注意模式匹配\do的参数支持LIKE风格的通配符如\do *可匹配所有以开头的运算符便于批量浏览。schema 限定输出的Schema列为pg_catalog说明这些是系统内置运算符自定义运算符会显示在创建它的 schema 下\do同样可以查到。小结\do是 psql 中最实用的元命令之一它把隐藏在pg_operator系统目录中的运算符重载信息以表格形式呈现让你一眼看清某个运算符的全部签名组合。以为例通过\do 可以看到它覆盖数组、range、jsonb、几何类型、tsquery 与 ACL 数组等十余种组合每一种都对应着“包含”语义在不同数据类型上的实现。掌握这个命令无论是排查类型错误、研究新运算符还是理解 PostgreSQL 的类型体系都会更加得心应手。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐PostgreSQL psql 实战用 \g 元命令把查询结果写入文件PostgreSQL psql 实战用 \g 元命令把查询结果写入文件 在 psql 交互式会话中绝大多数查询语句都以分号 ; 结尾来提交执行。其实 psq文档教程知识库macOS版本查询革命3分钟搞定所有版本信息macOS版本查询革命3分钟搞定所有版本信息 还在为查找macOS历史版本信息而头痛面对众多版本号、构建号和发布时间你是否感到无从下手gibMacOS项开发工具Steampipe跨版本兼容性确保查询脚本在所有版本运行Steampipe跨版本兼容性确保查询脚本在所有版本运行 痛点直击你的查询脚本为何突然失效 还在为Steampipe升级后查询脚本报错而头疼从v0.20开发工具云原生上一篇beets MPDStats 插件完全指南用 MPD 收听数据驱动播放次数、跳过次数与动态评分下一篇financial-services 项目实战initiating-coverage 技能 Task 2 财务建模全流程指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。