?
संभव नहीं है, आप अलग-अलग नाम से डुप्लीकेट ऑपरेटर बना सकते हैं।
नया ऑपरेटर
Postgres में ऑपरेटर बनाने के लिए सिंटैक्स:
CREATE OPERATOR name (
PROCEDURE = function_name
[, LEFTARG = left_type ] [, RIGHTARG = right_type ]
[, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]
[, RESTRICT = res_proc ] [, JOIN = join_proc ]
[, HASHES ] [, MERGES ]
)
?|
. के मामले में jsonb
. में उपयोग किया जाता है यह होगा:
CREATE OPERATOR ^|(
PROCEDURE = jsonb_exists_any,
LEFTARG = jsonb,
RIGHTARG = _text,
RESTRICT = contsel,
JOIN = contjoinsel);
मैंने ^|
. का उपयोग किया है एक उदाहरण के रूप में, वैकल्पिक नाम। यह इस सूची का कोई भी क्रम हो सकता है:+ - * / < > = ~ ! @ # % ^ & |
?`।
आप pg_catalog.pg_operator तालिका को क्वेरी करके उस ऑपरेटर की वर्तमान परिभाषा पा सकते हैं जिसमें आप रुचि रखते हैं।
SELECT oid, *
FROM pg_catalog.pg_operator
WHERE oprname = '?|'
AND oprleft = (SELECT oid FROM pg_type WHERE typname = 'jsonb');
आप GUI टूल जैसे pgAdmin का भी उपयोग कर सकते हैं और pg_catalog
browse ब्राउज़ कर सकते हैं SQL परिभाषा को पुन:उपयोग के लिए तैयार करने के लिए।
अनुक्रमणिका सक्षम करना
यदि आप इस "नए" ऑपरेटर के लिए अनुक्रमणिका का उपयोग करना चाहते हैं, तो आपको नया ऑपरेटर वर्ग और वैकल्पिक रूप से परिवार बनाना होगा। हमारे मामले में, हमें दोनों की आवश्यकता है, क्योंकि हम इसे मौजूदा परिवार में नहीं जोड़ सकते, क्योंकि डिफ़ॉल्ट ऑपरेटर पहले से ही रणनीति स्लॉट ले रहा है।
ऑपरेटरों की तरह ही, यह अनुशंसा की जाती है कि आप ऑपरेटर कक्षाओं को ब्राउज़ करने के लिए pgAdmin जैसे GUI टूल का उपयोग करें और बस इसे कॉपी और पेस्ट करें।
सबसे पहले, हम उस ऑपरेटर का OID लेते हैं जिसे हमने डुप्लिकेट किया था:
SELECT oid, *
FROM pg_catalog.pg_operator
WHERE oprname = '?|'
AND oprleft = (SELECT oid FROM pg_type WHERE typname = 'jsonb');
ऑपरेटर परिवार के लिए एक ही बात (हम इसके बजाय ऑपरेटर क्लास टेबल से प्राप्त करेंगे), हम जिन क्लास की तलाश कर रहे हैं क्योंकि यह वही है जो ?|
का समर्थन करता है . opcdefault
का उपयोग किया जाता है, क्योंकि वैकल्पिक वर्ग है jsonb_path_ops
जो इस ऑपरेटर का समर्थन नहीं करता:
SELECT opcfamily
FROM pg_opclass
WHERE opcintype = (SELECT oid FROM pg_type WHERE typname = 'jsonb')
AND opcmethod = (SELECT oid FROM pg_am WHERE amname = 'gin')
AND opcdefault
फिर हमें उस ऑपरेटर द्वारा उपयोग की जाने वाली रणनीति मिलती है जिसे हमने दोहराया है:
SELECT amopstrategy,
(SELECT typname FROM pg_type WHERE oid = amoplefttype) AS left_t,
(SELECT typname FROM pg_type WHERE oid = amoprighttype) AS right_t,*
FROM pg_amop
WHERE amopfamily = 4036 --family oid
AND amopopr = 3248 --operator oid
फिर वर्ग द्वारा उपयोग किए जाने वाले कार्य:
SELECT amprocnum, amproc::text, pg_get_function_identity_arguments(amproc::oid) AS args,
(SELECT typname FROM pg_type WHERE oid = amproclefttype) AS left_t,
(SELECT typname FROM pg_type WHERE oid = amprocrighttype) AS right_t,*
FROM pg_amproc
WHERE amprocfamily = 4036 --op family
यह हमें इस ऑपरेटर वर्ग में लाता है। यदि यह पहले से मौजूद नहीं है तो यह ऑपरेटर परिवार बनाएगा।
CREATE OPERATOR CLASS jsonb_ops_custom
FOR TYPE jsonb USING gin AS
OPERATOR 10 ^|(jsonb, _text),
FUNCTION 1 gin_compare_jsonb(text, text),
FUNCTION 2 gin_extract_jsonb(jsonb, internal, internal),
FUNCTION 3 gin_extract_jsonb_query(jsonb, internal, smallint, internal, internal, internal, internal),
FUNCTION 4 gin_consistent_jsonb(internal, smallint, jsonb, integer, internal, internal, internal, internal),
FUNCTION 6 gin_triconsistent_jsonb(internal, smallint, jsonb, integer, internal, internal, internal);
अब आपको केवल उस ऑपरेटर नाम का उपयोग करके अनुक्रमणिका बनाने की आवश्यकता है जो बनाया गया था, कुछ ऐसा:
CREATE INDEX ON jsonb_table USING gin(jsonb_column jsonb_ops_custom)
और आपको अनुक्रमणिका का उपयोग करने में सक्षम होना चाहिए:
SET enable_seqscan = off;
EXPLAIN ANALYZE
SELECT * FROM jsonb_table WHERE jsonb_column ^| array['b', 'c'];