【问题标题】:How to define an operator alias in PostgreSQL?如何在 PostgreSQL 中定义运算符别名?
【发布时间】:2010-08-12 17:35:55
【问题描述】:

有没有一种简单的方法可以在 PostgreSQL 中为 = 运算符定义运算符别名?

!=<> 运算符如何解决这个问题?只有 <> 运算符似乎在 pg_operators 中。 != 运算符是硬编码的吗?

这是使用自定义运算符的应用程序所必需的。在大多数环境中,这个操作符应该像=,但在某些情况下,我们通过创建自己的操作符和操作符类来定义特殊行为。但是在正常情况下,我们的操作符应该只是= 操作符的别名,这样对于应用程序使用的实现是透明的。

【问题讨论】:

    标签: database postgresql alias operator-keyword


    【解决方案1】:

    只需检查 pgAdmin,即模式 pg_catalog。它具有所有运算符,并向您展示如何为所有数据类型创建它们。是的,您必须为所有数据类型创建它们。所以它不仅仅是一个“别名”,你需要很多别名。

    char = char 的示例,使用 !!!!作为别名:

    CREATE OPERATOR !!!!   -- name
    (
      PROCEDURE = pg_catalog.chareq,
      LEFTARG = "char",
      RIGHTARG = "char",
      COMMUTATOR = !!!!, -- the same as the name
      RESTRICT = eqsel,
      JOIN = eqjoinsel,
      HASHES,
      MERGES
    );
    SELECT 'a' !!!! 'a' -- true
    SELECT 'a' !!!! 'b' -- false
    

    检查manual 并注意命名规则,它有一些限制。

    【讨论】:

    • 这就是我到现在为止所做的。但是要让索引也与该运算符一起使用,我还必须定义一个运算符类和系列,并且必须创建一个附加索引。例如,对于索引CREATE INDEX idx_fk1 ON tab (fk);,需要另一个具有新操作类CREATE INDEX idx_fk2 ON tab (fk my_int4_ops); 的索引,以便两个查询都能够使用索引:EXPLAIN ANALYZE SELECT * FROM tab WHERE fk = 1;EXPLAIN ANALYZE SELECT * FROM tab WHERE fk !!!! 1;。所以我想知道是否有一种方法不需要创建很多新索引。
    • 大量的工作和很大的错误空间。我会再考虑并寻找更好的解决方案。
    猜你喜欢
    • 2019-07-24
    • 2018-12-04
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 2021-10-04
    相关资源
    最近更新 更多