PostgreSQL 中的并行 unnest() 和排序顺序

2024-01-05

我明白使用

SELECT unnest(ARRAY[5,3,9]) as id

没有ORDER BY子句中,不保证结果集的顺序。例如我可以得到:

id
--
3
5
9

但是下面的请求呢:

SELECT
  unnest(ARRAY[5,3,9]) as id,
  unnest(ARRAY(select generate_series(1, array_length(ARRAY[5,3,9], 1)))) as idx
ORDER BY idx ASC

是否保证2unnest()调用(具有相同的长度)将并行展开,并且索引idx确实会匹配数组中项目的位置吗?

我使用的是 PostgreSQL 9.3.3。


是的,这是 Postgres 的一个功能,并行解除嵌套是保证保持同步(只要所有数组具有相同数量的元素)。
Postgres 9.4 为并行解除嵌套添加了一个干净的解决方案:

  • 并行解除多个数组的嵌套 https://stackoverflow.com/questions/27836674/passing-arrays-to-stored-procedures-in-postgres/27854382#27854382

但是,不能保证结果行的顺序。实际上,用一个简单的语句:

SELECT unnest(ARRAY[5,3,9]) AS id;

结果行的顺序是“有保证的”,但 Postgres 不会断言任何内容。只要未显式定义顺序,查询优化器就可以自由地按其认为合适的方式对行进行排序。这可能在更复杂的查询中产生副作用。

如果问题中的第二个查询是您真正想要的(向未嵌套的数组元素添加索引号),则有更好的方法生成下标() https://www.postgresql.org/docs/current/functions-srf.html#FUNCTIONS-SRF-SUBSCRIPTS:

SELECT unnest(ARRAY[5,3,9]) AS id
     , generate_subscripts(ARRAY[5,3,9], 1) AS idx
ORDER  BY idx;

此相关答案中的详细信息:

  • 如何使用postgreSQL访问数组内部索引? https://stackoverflow.com/questions/12246738/how-to-access-array-internal-index-with-postgresql/12250006#12250006

您将会感兴趣WITH ORDINALITY https://www.postgresql.org/docs/current/functions-srf.html在 Postgres 中9.4:

  • PostgreSQL unnest() 与元素编号 https://stackoverflow.com/questions/8760419/postgresql-unnest-with-element-number/8767450#8767450

然后你可以使用:

SELECT * FROM unnest(ARRAY[5,3,9]) WITH ORDINALITY tbl(id, idx);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostgreSQL 中的并行 unnest() 和排序顺序 的相关文章

随机推荐

  • 在多阶段 docker 构建中使用变量

    我想在多阶段 docker 构建中使用变量 如同这个问题 https stackoverflow com questions 52904847 在撰写本文时尚未得到答复 我的具体用例是在builder阶段并保存目录 这是在变量中完成的 并在
  • React:创建 onClick HOC 而不使用额外的

    我想避免手动添加onClick我的自定义组件的属性 为此 我考虑了一个名为的高阶组件WithClick这将用集成的组件包裹我的组件onClick财产 我面临的问题是 为了包装它 我必须使用额外的 div div 标签来访问事件属性 这个标签
  • 如何以编程方式检测 ensemble 客户端中的哪个服务器连接到?

    如何以编程方式检测客户端连接到 ZooKeeper 集合中的哪台服务器 我正在使用阿帕奇策展人 http curator apache org API 和我正在通过注册监听连接状态变化连接状态监听器 https curator apache
  • ASP.NET WebAPI 中的模拟和异步

    Update 2 这个问题最初是 模仿可以与 Web API 一起使用吗 这个问题的问题是 是的 确实如此 但问题不在于 Web API 而在于模仿本身 问题描述如下 但现在我想告诉其他人解决方案 我的控制器是异步的 我错误的前提是模拟线程
  • 如何使用 C# 检查打印机是否已安装并准备就绪?

    如何使用 NET 3 5 和 Visual Studio 2008 在 C 中以编程方式检查打印机是否已安装 如果有 如何检查它是否已打开并准备好使用 提前致谢 此代码片段将检索有关已安装打印机的信息 using System Drawin
  • 读取或转换 word .doc 文件 iOS

    iOS 上的其他应用程序如何读取和写入 Word 文档 我看到其他一些与此相关的问题 并且接受的答案都是 这是不可能完成的 我不想只显示 Word 文档 我想阅读它及其格式 其他应用程序是如何做到这一点的 他们是否使用微软发布的发布标准自己
  • 如何实时处理音频流

    我有一个运行最新 jessie 的树莓派 3 的设置 其中安装了所有更新 其中我提供了一个 A2DP 蓝牙接收器 我可以在其中连接手机播放一些音乐 通过pulseaudio 源 电话 被路由到alsa 输出 接收器 这相当有效 我现在想使用
  • 可以在 SQLAlchemy 中执行没有子查询的 UNION 吗?

    另一个问题展示了如何在 SQLAlchemy 中进行联合 https stackoverflow com a 20032394 565879 是否可以在不使用子查询的情况下在 SQLAlchemy 中执行联合 例如 在链接的问题中 SQLA
  • Shopify option_selection.js - 如何修改?

    我遇到了一点麻烦 我正在重新设计我的商店 并尝试改变变体下拉菜单在前端的显示方式 据我所知 option selection js 是一个从 Shopifys 服务器托管和加载的全局资产 它改变了我的产品选项在我的主题中的显示方式 目前 它
  • 如何以 DRY 方式将“活动”类应用到基于 current_page 的导航? - 轨道3

    所以在我的application html erb我的导航结构看起来像这样 div ul class pills li li li li ul div
  • 多个API密钥

    我的公司帮助为多个客户开发谷歌地图网络应用程序 我个人不是开发人员 所以请原谅我问一个对其他人来说可能很明显的问题 我需要注册多个 API 密钥 因为我不希望我的一个 API 密钥超过 25K 那么是否可以注册多个 API 密钥 我的每个客
  • Hudson/maven 发布快照

    我希望能够使用 Maven 将快照发布到存储库 或者让 Hudson 在每次使用 Maven 构建后发布快照 我一直在阅读 POM 的 SCM 部分 并且有几个问题 抱歉 如果我在这里偏离了基地 这部分对我来说是新的 我不想将我的用户名和密
  • 堆栈上的内存泄漏

    C 中是否有可能造成内存泄漏没有堆分配 通过非常糟糕的设计 我想到的一个例子 如果它没有达到我的预期 请纠正我 include
  • 为什么带有 @Transactional 方法的类不能自动装配?

    我将 Spring Security 与 WAFFLE 过滤器结合使用 该过滤器根据 ActiveDirectory 服务器对用户进行身份验证 我创建了一个额外的过滤器 它还根据我的数据库对用户进行身份验证 它只是检查是否 先前经过身份验证
  • Rust/Diesel:如何查询并插入具有 uuid 的 postgres 表

    我有 Diesel 生成的以下架构 table user id id gt Uuid name gt Text 以及相关模型 use diesel self Queryable Insertable use diesel prelude u
  • 每种类型数据库的实际示例(真实案例)[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有多种类型的数据库用于不同的目的 但通常 MySQL 可以用于所有用途 因为它是最知名的数据库 举个例子 在我的公司 大数据的应用初期就有MyS
  • 如何在同一层次结构路由中将 Shell Route 与 GoRoute 一起使用

    如何在同一层次结构路由中将 Shell Route 与 GoRoute 一起使用 如何使用导航栏按钮之一从 ShellRoute 推送到与 ShellRoute 同一层次结构中的 GoRoute 目前GoRouter的路由有两个值 Shel
  • 使用代理在 Windows 7 上安装 gems 时出现问题

    我正在尝试在 Windows 7 上通过代理安装 ruby 我查看了各种论坛并成功设置了 我认为 http proxy 见下文 SET HTTP PROXY http username password http proxyhere com
  • 为什么 matlab 有基于 1 的索引 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我之前曾使用 Java 和 Python 进行编程 但最近开始使用 MATLAB 来处理很多事情 特别是计算机视觉算法 然而 MATLAB 的数
  • PostgreSQL 中的并行 unnest() 和排序顺序

    我明白使用 SELECT unnest ARRAY 5 3 9 as id 没有ORDER BY子句中 不保证结果集的顺序 例如我可以得到 id 3 5 9 但是下面的请求呢 SELECT unnest ARRAY 5 3 9 as id