PostgreSQL错误:运算符>>不是有效的订购运营商

时间:2012-07-20 13:30:18

标签: postgresql operators b-tree

首先,我对postgresql没有太多经验,所以我先生道歉。我最近将我的服务器从postgresql版本8.3升级到版本9,在恢复我的数据后,我遇到了一个我无法解决的查询中的运算符问题。我想查询:

  

database =#使用>>选择bbox从dems订购bbox限制1;

bbox是我的表dems类型框中的一列。

我得到结果:

  

错误:运算符>>不是有效的订购运营商

     

第1行:使用>>通过bbox从dems订单中选择bbox限制1;

     

提示:订购运营商必须是“<”或“>” btree运营商家庭的成员。

我以为“>>”运算符内置到postgresql类型框中,我想知道我在这里做错了什么。该查询与8.3版完美配合。我的老同事编写了原始代码并设置了服务器,因此我可能缺少一些恢复步骤。任何帮助都会很棒,我会在同一时间继续阅读文档。

谢谢!

1 个答案:

答案 0 :(得分:0)

这里的基本问题是,您似乎只是通过简单地命令生成包含框的树。订购不是这样做的方式。而是使用带递归查询和窗口函数(两者都需要8.4或更高版本的iirc)。在这种情况下,例如:

WITH RECURSIVE bbox_tree (id, bbox, level, position, path) AS
( select id, bbox, 1, rownumber() over (order by id), id::text
   from dems
  UNION ALL
 SELECT d.id, d.bbox, t.level + 1, rownumber over (partition by t.id order by d.id),
        p.path || ',' d.id
   FROM dems d
   JOIN bbox_tree t ON t.bbox >> d.bbox )
SELECT bbox FROM  bbox_tree order by string_to_array(t.path, ',');

你实际上必须在这里创建一个树。