首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有可能对运算符进行模式限定?

是否有可能对运算符进行模式限定?
EN

Database Administration用户
提问于 2017-11-25 04:22:07
回答 2查看 473关注 0票数 2

假设我在模式PostGIS中创建了一个扩展,比如postgis

代码语言:javascript
复制
CREATE EXTENSION postgis WITH SCHEMA postgis;

在下面的示例中,是否可以完全限定像&&这样的运算符,

代码语言:javascript
复制
SELECT box2d && ST_MakePoint(5,5)
FROM postgis.box2d(postgis.ST_MakeEnvelope(0,0,10,10));

但是"postgis.&&",甚至"postgis".&&"postgis"."&&"都不是我的工作对象。关于“操作符类型解析”的文档似乎暗示有可能

如果指定了限定运算符名,则只考虑指定架构中的运算符。

换句话说,我可以使用一个操作符是“不是可见”。吗?

代码语言:javascript
复制
SELECT pg_type_is_visible(
  'postgis.&&(postgis.geometry,postgis.geometry)'::regoperator
);

显然,我可以将postgis添加到我的search_path中,但我希望保留这个未经修改的内容,在其他任何情况下,我们实际上都可以限定所有内容。

EN

回答 2

Database Administration用户

回答已采纳

发布于 2017-11-25 05:59:53

是的,它被记录在模式搜索路径下OPERATOR()

代码语言:javascript
复制
SELECT box2d OPERATOR(postgis.&&) postgis.ST_MakePoint(5,5) AS "&&"
FROM postgis.box2d(postgis.ST_MakeEnvelope(0,0,10,10));
票数 0
EN

Database Administration用户

发布于 2017-11-25 16:40:32

请注意,OPERATOR构造(如OPERATOR(postgis.&&))与操作符本身并不完全相同。运算符失去了它们的隐式优先级,返回到未定义,这可能会产生鬼鬼祟祟的副作用。考虑:

代码语言:javascript
复制
SELECT 3 + 3 * 2                        -- 9
     , 3 + 3 OPERATOR(pg_catalog.*) 2;  -- 12

OPERATOR(postgis.&&)没有任何影响,因为&&首先具有默认的操作符优先级。

相关信息:

另一个限制是:OPERATOR构造不适用于ANDORBETWEEN等SQL语法元素,这些元素有时也被称为“操作符”(并且具有自己的运算符优先级)。只适用于系统目录pg_operator中列出的运算符。

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/191695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档