为什么postgres中的数组索引需要括号?

时间:2017-06-08 23:25:47

标签: sql postgresql

在(postgres)SQL中,这是有效的语法,

select (array[ [1,2,3], [4,5,6]])[1];

但不是:

select array[ [1,2,3], [4,5,6]][1];

......这对我来说有点意外。这里发生了什么?

1 个答案:

答案 0 :(得分:2)

这是一个解析器问题。 PostgreSQL使用Bison解析器 - 需要额外的括号来防止解析冲突。查询处理分阶段进行:解析,分析,计划和执行。在解析时间方面没有足够的信息来保护野牛免受可能的冲突,然后一些语法不被禁止。

因为数组是专有的PostgreSQL功能(非常成功)并且ANSI没有描述语法,所以开发人员更喜欢一些折衷设计,对用户来说足够好,并且不需要太复杂的代码。 PostgreSQL的一个重点是SQL,而不是数组处理。 Bison是非常好的成熟工具,但有时速度要求有些语法很难或不可能。

select array[ [1,2,3], [4,5,6]]::int[][1]

如果你知道一个事实就没有任何魔力,所以数组类型定义中的限制只是语法糖。 int[]int[1]int[] [100]只是int[]。然后array[ [1,2,3], [4,5,6]]::int[][1]array[ [1,2,3], [4,5,6]]::int[]相同。取一个数值数组并将其转换为整数数组。