是的,这是 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);