2017-05-01 9 views
6

का उपयोग कर प्रकार json [] की समानता ऑपरेटर की पहचान:सके जब मैं एक एकल तालिका एक <code>UNION</code> नियम</p> <p>का उपयोग कर रहा है दो तालिकाओं पर कई प्रश्न करने के लिए कोशिश कर रहा हूँ यूनिअन

  • परियोजना (आईडी, नाम, पिन किए गए बूलियन)
  • कौशल (परियोजनाओं के लिए M2M)

मैं पहली बार जोको pinned सेट है पंक्तियों की एक सरणी प्राप्त करने के लिए देख रहा हूँऔर भरने नवीनतम प्रविष्टियों के साथ शेष

SELECT 
    project.id AS project_id, 
    project.name AS project_name, 
    array_agg(json_build_object('skill_id', project_skills.id,'name', project_skills.skill)) AS skills 
from project 
LEFT OUTER JOIN project_skills on project.name = project_skills.project 
WHERE project.pinned = true 
GROUP BY project_id,project_name 

UNION 

SELECT 
    project.id AS project_id, 
    project.name AS project_name, 
    array_agg(json_build_object('skill_id', project_skills.id,'name', project_skills.skill)) AS skills 
from project 
LEFT OUTER JOIN project_skills on project.name = project_skills.project 
WHERE project.id != 1 AND project.pinned = false 
GROUP BY project_id,project_name 
ORDER BY project.create_date DESC LIMIT 5 

जब यह पूछताछ (pinned सेट false करने के लिए), मैं नीचे त्रुटि मिलती है

ERROR: could not identify an equality operator for type json[] 
LINE 7: array_agg(json_build_object('skill_id', project_skills.id,... 

मुझे यह समझ में नहीं आता त्रुटि। क्या यह असफल रहा है क्योंकि यह दोनों परिणामों से जेसन कॉलम की तुलना करने की कोशिश कर रहा है?

मैं पोस्टग्रेस 9.4 का उपयोग कर रहा हूं।

उत्तर

8

जब आप UNION का उपयोग करते हैं, तो डीबीएमएस किसी भी डुप्लिकेट पंक्तियों को हटा देता है, और ऐसा करने के लिए इसे पहचानने की आवश्यकता होती है कि दो पंक्ति बराबर/समान हैं या नहीं। बदले में इसका मतलब यह है कि दो पंक्तियों के प्रत्येक कॉलम की तुलना इसकी तुलना कर रही है, और यह तय करना है कि वे बराबर हैं या नहीं।

त्रुटि संदेश जो आप देख रहे हैं वह है जहां आपके कॉलम में से एक array_agg(json_build_object(...)) का उपयोग करके बनाया गया है जो json[] प्रकार का मान बनाता है, जिसका अर्थ है "जेसन मानों की सरणी"। चूंकि पोस्टग्रेस नहीं जानते कि JSON मानों के दो सरणी की तुलना कैसे करें, यह तय नहीं कर सकता कि आपका UNION डुप्लिकेट तैयार करता है या नहीं।

यदि आप वास्तव में डुप्लिकेट को हटाने की परवाह नहीं करते हैं, तो सबसे सरल समाधान UNION ALL का उपयोग करना है जो इस चरण को छोड़ देता है।

+4

@ कंकका से अधिक सहायक था: यदि 'यूनियन' की आवश्यकता है * * एक विकल्प 'jsonb' पर डालना है (या सरणी को' jsonb [] 'के अनुसार डालना), जिसके लिए समानता ऑपरेटर परिभाषित किया गया है। देखें: http://stackoverflow.com/a/24296054/939860 या http://stackoverflow.com/a/30520760/939860। (हालांकि, आप मूल प्रारूप खो देते हैं, हालांकि - जो आमतौर पर अप्रासंगिक है।) –

+0

एक ही समस्या थी और मैंने समूह में दोनों को ':: टेक्स्ट' का उपयोग करके टेक्स्ट में मूल्य का चयन करके चयन में आसानी से तुलना करने के लिए चुना। एक स्तर पर विचारों के पदानुक्रम का निर्माण कर रहा था, जब मैं ':: जेसन []' के साथ जरूरी था तो मैं बस जेसन पर वापस आ गया। पीजी 9.6 का उपयोग करना। –

1

मुझे बस इतना करना था कि मुझे UNION ALL का उपयोग करना था - मुझे लगता है कि यह json से अधिक प्रश्नों की तुलना करने की कोशिश कर रहा है।

+0

यह आईएमएसओपी के उत्तर पर एक टिप्पणी होनी चाहिए। –

+0

@ErwinBrandstetter मैंने वास्तव में इस पोस्ट का जवाब प्राप्त करने से पहले समाधान को समझ लिया। मैंने पोस्ट को हटाने के बजाय अभी अपना जवाब जोड़ा। मैंने अपना जवाब वैसे भी स्वीकार कर लिया है, हालांकि यह – Kannaj

संबंधित मुद्दे

 संबंधित मुद्दे