Postgresql

在包含擴展 intarray 後使用 PostgreSQL 內置運算符 <@

  • November 24, 2021

我將intarray擴展添加到我的 PostgreSQL 數據庫以使用-運算符,但我仍然想使用內置 &lt;@運算符,而不是intarray 的 &lt;@運算符。有沒有辦法做到這一點?

首選內置運算符的原因是內置運算符允許NULL相關數組中的值,而intarray運算符在出現值時會引發錯誤NULL

如果您將intarray擴展安裝到public架構(或其他架構pg_catalog),您可以對操作員進行架構限定以選擇內置的。

代替

a &lt;@ b

你可以寫

a OPERATOR(pg_catalog.&lt;@) b

對其進行模式限定。

例如

test=# SELECT 1 OPERATOR(pg_catalog.+) 2;
?column? 
----------
       3
(1 row)

@Craig 寫的。

另外,要查找安裝了哪些擴展:

SELECT n.nspname, e.extname
FROM   pg_extension e
JOIN   pg_namespace n ON n.oid = e.extnamespace;

結果:

nspname    | extname
-----------+----------
pg_catalog | plpgsql
public     | intarray
public     | btree_gist
...

請注意,模式限定運算符 ( OPERATOR(pg_catalog.&lt;@)) 具有 預設運算符優先級(失去任何特殊狀態)。不會更改任何內容,&lt;@因為它具有預設的運算符優先級。手冊中的詳細資訊在這裡。


最後,由於安裝的運算符intarray僅適用於integer[]預設運算符適用於anyarray,因此獲得預設行為的一種快速而骯髒的方法是將integer數組轉換為bigint數組:

SELECT a::bigint[] &lt;@ b::bigint[]

a並且b是類型int[]。您可以使用real[], float[]numeric[]或者也可以使用text[]它們,它們都可以工作。

細節:

SELECT n.nspname, o.oprname, o.oprleft::regtype, o.oprright::regtype
FROM   pg_operator o
JOIN   pg_namespace n ON n.oid = o.oprnamespace
WHERE  oprname = '&lt;@'
AND   (oprleft::regtype::text  ~~ '%any%' OR
      oprleft::regtype::text  ~~ '%integer%');

結果:

nspname    | oprname | oprleft    | oprright
-----------+---------+------------+----------
pg_catalog | &lt;@      | anyrange   | anyrange
pg_catalog | &lt;@      | anyelement | anyrange
pg_catalog | &lt;@      | anyarray   | anyarray
public     | &lt;@      | integer[]  | integer[]

引用自:https://dba.stackexchange.com/questions/110599