在(postgres)SQL中,这是有效的语法,
select (array[ [1,2,3], [4,5,6]])[1];
但不是:
select array[ [1,2,3], [4,5,6]][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[]
相同。取一个数值数组并将其转换为整数数组。