Postgresql
在包含擴展 intarray 後使用 PostgreSQL 內置運算符 <@
我將intarray擴展添加到我的 PostgreSQL 數據庫以使用
-
運算符,但我仍然想使用內置<@
運算符,而不是intarray 的<@
運算符。有沒有辦法做到這一點?首選內置運算符的原因是內置運算符允許
NULL
相關數組中的值,而intarray運算符在出現值時會引發錯誤NULL
。
如果您將
intarray
擴展安裝到public
架構(或其他架構pg_catalog
),您可以對操作員進行架構限定以選擇內置的。代替
a <@ b
你可以寫
a OPERATOR(pg_catalog.<@) b
對其進行模式限定。
例如
test=# SELECT 1 OPERATOR(pg_catalog.+) 2; ?column? ---------- 3 (1 row)
另外,要查找安裝了哪些擴展:
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.<@)
) 具有 預設運算符優先級(失去任何特殊狀態)。不會更改任何內容,<@
因為它具有預設的運算符優先級。手冊中的詳細資訊在這裡。最後,由於安裝的運算符
intarray
僅適用於integer[]
預設運算符適用於anyarray
,因此獲得預設行為的一種快速而骯髒的方法是將integer
數組轉換為bigint
數組:SELECT a::bigint[] <@ 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 = '<@' AND (oprleft::regtype::text ~~ '%any%' OR oprleft::regtype::text ~~ '%integer%');
結果:
nspname | oprname | oprleft | oprright -----------+---------+------------+---------- pg_catalog | <@ | anyrange | anyrange pg_catalog | <@ | anyelement | anyrange pg_catalog | <@ | anyarray | anyarray public | <@ | integer[] | integer[]