PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

स्प्रिंग जेपीए रिपोजिटरी के साथ प्रश्न चिह्न (?) चरित्र से कैसे बचें?

? संभव नहीं है, आप अलग-अलग नाम से डुप्लीकेट ऑपरेटर बना सकते हैं।

नया ऑपरेटर

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'];


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL में XML फ़ाइलें आयात करें

  2. MSSQL से PostgreSQL में माइग्रेट करना - आपको क्या पता होना चाहिए

  3. रेल 4 माइग्रेशन में कस्टम प्राथमिक कुंजी सेट करने में समस्याएं

  4. मेरा पसंदीदा पोस्टग्रेएसक्यूएल एक्सटेंशन - भाग दो

  5. DROP TABLE यदि PostgreSQL में उदाहरण मौजूद है