Postgres数组比较混乱

时间:2012-03-22 17:17:16

标签: arrays postgresql comparison aggregate-functions

当我跑步时

select array[19,21,500] <= array[23,5,0]; 

我明白了。

但是当我跑步时

select array[24,21,500] <= array[23,5,0]; 

我弄错了。这表明比较仅在第一个元素上进行。

我想知道是否有一个运算符或可能的函数比较所有条目,这样如果左数组中的所有条目都小于右数组中的条目(在同一索引处),它将返回true,否则返回假的。

我希望检索整个数组“小于”或“大于”给定数组的所有行。我不知道这是否可能。

2 个答案:

答案 0 :(得分:2)

数组使用普通性作为基本属性。换句话说,'{1,3,2}' <> '{1,2,3}'在查看比较时这一点很重要。这些看看连续的元素。

想象一下,PostgreSQl没有inet类型。我们可以使用int []来指定cidr块。例如,我们可以将其视为'{10,0,0,1,8}'来表示10.0.0.1/8。然后我们可以通过这种方式比较IP地址。我们也可以表示为:'{167772161,8}'在这种比较中,如果您有两个具有不同子网的IP地址,我们可以比较它们,具有更具体子网的那个将在具有更少子网的子网之后特定子网。

数据库规范化的基本原则之一是每个字段应为其域保存一个且仅包含一个值。数组不一定违反这一原则的一个原因是,因为它们具有正常性(因此充当元组而不是包 em>),您可以使用它们来表示奇异值。在这种情况下,比较非常有意义。

如果您想创建一个不遵守常规的运算符,您可以创建自己的运算符。基本上你创建了一个基于二者返回bool的函数,然后将它包装在一个运算符中(有关如何执行此操作的更多信息,请参阅文档中的CREATE OPERATOR)。您绝不会受到PostgreSQL开箱即用的限制。

答案 1 :(得分:1)

要实际执行您要求的操作,请并行使用unnest()并与bool_and()汇总:

SELECT bool_and(a <  b) -- each element < corresponding element in 2nd array
      ,bool_and(a <= b)
      ,bool_and(a >= b)
      ,bool_and(a >  b)
       -- etc.
FROM  (SELECT unnest('{1,2,3}'::int[]) AS a, unnest('{2,3,4}'::int[]) AS b) t

两个数组都需要并行显示相同数量的基本元素。否则你得到CROSS JOIN,即完全不同的结果。