मेरे पास एक टेबल है, persons
जिसमें दो कॉलम हैं, एक id
और एक JSONB- आधारित data
कॉलम (यह तालिका सिर्फ पोस्टग्रेजिक के JSON समर्थन के साथ खेलने के लिए प्रदर्शन के उद्देश्यों के लिए बनाई गई है)।
अब, माना जाता है कि इसमें दो रिकॉर्ड हैं:
1, { name: 'John', age: 30 }
2, { name: 'Jane', age: 20 }
अब, माना जाता है कि मैं 25 वर्ष से अधिक आयु के प्रत्येक व्यक्ति का नाम प्राप्त करना चाहता हूं। मैंने जो कोशिश की है वह है:
select data->'name' as name from persons where data->'age' > 25
दुर्भाग्य से, यह एक त्रुटि का परिणाम है। मैं ->>
इसके बजाय का उपयोग करके इसे हल कर सकता हूं ->
, लेकिन फिर तुलना किसी भी अपेक्षा के अनुसार काम नहीं करती है, क्योंकि संख्याओं की तुलना नहीं की जाती है, लेकिन स्ट्रिंग्स के रूप में उनका प्रतिनिधित्व:
select data->'name' as name from persons where data->>'age' > '25'
फिर मुझे पता चला कि मैं वास्तव में इस मुद्दे को हल करके ->
और एक कास्ट को हल कर सकता हूं int
:
select data->'name' as name from persons where cast(data->'age' as int) > 25
यह काम करता है, लेकिन यह अच्छा नहीं है कि मुझे वास्तविक प्रकार ( age
JSON दस्तावेज़ का प्रकार number
वैसे भी जानना है, इसलिए PostgreSQL यह पता नहीं लगा सकता है कि अपने आप क्यों?)।
फिर मुझे पता चला कि अगर मैं मैन्युअल रूप text
से ::
वाक्यविन्यास का उपयोग करने में परिवर्तित हो जाता हूं , तो सब कुछ अपेक्षा के अनुसार काम करता है, हालांकि - अब हम फिर से तार की तुलना कर रहे हैं।
select data->'name' as name from persons where data->'age'::text > '25'
अगर मैं उम्र के बजाय नाम के साथ यह कोशिश करता हूं, तो यह काम नहीं करता है:
select data->'name' as name from persons where data->'name'::text > 'Jenny'
इसके परिणामस्वरूप त्रुटि होती है:
प्रकार json के लिए अमान्य इनपुट सिंटैक्स
बहुत स्पष्ट रूप से, मुझे यहाँ कुछ नहीं मिलता है। दुर्भाग्य से, PostgreSQL के साथ JSON का उपयोग करने के किसी भी वास्तविक दुनिया के उदाहरणों को खोजना काफी कठिन है।
कोई संकेत?
'Jenny'
में था '"Jenny"'
।
data->'name'::text
, आप'name'
स्ट्रिंग को पाठ में डाल रहे हैं, परिणाम नहीं। आपको एक त्रुटि जब की तुलना में नहीं मिलता है'25'
क्योंकि25
एक मान्य JSON शाब्दिक है, लेकिनJenny
नहीं है (हालांकि"Jenny"
होगा)।