【问题标题】:PostgreSQL Error: operator >> is not a valid ordering operatorPostgreSQL 错误:运算符 >> 不是有效的排序运算符
【发布时间】:2012-07-19 18:59:42
【问题描述】:

首先,我对 postgresql 不太熟悉,所以我提前道歉。我最近将我的服务器从 postgresql 8.3 版升级到了 9 版,在恢复我的数据后,我在一个无法解决的查询中遇到了操作员问题。我正在尝试查询:

database=# select bbox from dems order by bbox using >> limit 1;

bbox 是我的表格中的一列 dems 类型为 box。

我得到结果:

错误:运算符 >> 不是有效的排序运算符

第1行:使用>>limit 1从dems order by bbox中选择bbox;

提示:排序运算符必须是 btree 运算符族的“”成员。

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

谢谢!

【问题讨论】:

  • 我不认为>> 是排序运算符,因为a << ba >> ba = b 很可能都不为真。
  • 我写了关于 ORDER BY .. USING ... over here 的文章。也许它可以帮助您了解在旧系统中寻找缺失部分的位置。

标签: postgresql operators b-tree


【解决方案1】:

您的基本问题是您似乎试图通过简单地对它们进行排序来生成包含框的树。订购不是做到这一点的方法。而是使用递归查询和窗口函数(两者都需要 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, ',');

您实际上必须在这里创建一棵树。

【讨论】:

    猜你喜欢
    • 2012-02-20
    • 2018-05-05
    • 2018-07-19
    • 2017-08-10
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2012-07-23
    相关资源
    最近更新 更多