दुर्भाग्य से सीधे json
करने का कोई आसान तरीका नहीं है 9.3 में समानता परीक्षण।
9.3 का json
type में कोई समानता ऑपरेटर नहीं है, क्योंकि यह json को डुप्लिकेट कुंजियों के साथ स्वीकार करता है (जैसा कि कई कार्यान्वयन अपेक्षित हैं)। यह स्पष्ट नहीं है कि {"a":1, "a":2}
{"a":1}
. के "बराबर" है या नहीं।
9.4 jsonb
जोड़ता है जो अंतिम-कुंजी-जीत के आधार पर डुप्लिकेट कुंजियों को ध्वस्त कर देता है, जिससे समानता स्पष्ट हो जाती है।
regress=# SELECT '{"a":1, "a":2}'::json = '{"a":1}'::json;
ERROR: operator does not exist: json = json
LINE 1: SELECT '{"a":1, "a":2}'::json = '{"a":1}'::json;
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
regress=# SELECT '{"a":1, "a":2}'::jsonb = '{"a":1}'::jsonb;
?column?
----------
f
(1 row)
दुर्भाग्य से, इसका मतलब है कि आप केवल 9.3 में वह नहीं कर सकते जो आप चाहते हैं।
आप json
. के लिए एक कस्टम समानता ऑपरेटर लिख सकते हैं - शायद दोनों को टेक्स्ट में कास्ट करना और उस तरह से तुलना करना, लेकिन यह {"a":1, "b":2}
का इलाज करेगा और {"b":2, "a":1}
असमान के रूप में।
एक बेहतर विकल्प यह होगा कि PL/V8 को स्थापित किया जाए और समानता की तुलना करने के लिए V8 जावास्क्रिप्ट इंजन के json संचालन का उपयोग किया जाए।
json
. के लिए एक समानता ऑपरेटर को परिभाषित करें , फिर उस ऑपरेटर का उपयोग करके एक साधारण बी-ट्री ऑपक्लास को परिभाषित करें। SQL स्तर पर दोनों करना आसान है - देखें CREATE OPERATOR
और CREATE OPERATOR CLASS
।
एक बार ऐसा करने के बाद आप GROUP BY
. में सक्षम होंगे 9.3 में json मान।
या आप केवल 9.4 बीटा1 इंस्टॉल कर सकते हैं और jsonb
. का उपयोग कर सकते हैं ।