Sql-text को jsonb-string में कैसे बदलें?

Nov 23 2020

एक स्पष्ट तरीका प्रतीत नहीं होता है:

  • select 'a123'::text::jsonb= त्रुटि: टाइप json के लिए अमान्य इनपुट सिंटैक्स
  • select '"a123"'::text::jsonb= BAD स्ट्रिंग क्योंकि उद्धृत
    चेक यह देखने के select '"a123"'::text::jsonb = ('{"x":"a123"}'::jsonb)->'x'
    लिए कि गैर-उद्धृत सही है
  • select '123'::text::jsonb = ('{"x":123}'::jsonb)->'x';= तार नहीं

मुझे शुद्ध JSONb स्ट्रिंग्स के रूप में '123' और 'a123' की आवश्यकता है


पुनश्च: यह सामान्य स्वचालित-कुछ भी रूपांतरण का डुप्लिकेट नहीं है ।

जवाब

1 ErwinBrandstetter Nov 23 2020 at 20:10

अनुपयोगी स्ट्रिंग शाब्दिकों को बदलने के लिए , जो दोहरे उद्धरण चिह्नों में (या ) में नहीं लिपटे हैं, (या ) फ़ंक्शन का उपयोग करें :jsonbjsonto_jsonb()to_json()

SELECT to_jsonb(text 'a123');

ध्यान दें कि इनपुट एक स्ट्रिंग प्रकार हो गया है ( text, varchar, ...), न कि एक untyped शाब्दिक। यही कारण है कि Postgres जानता है कि आप JSON स्ट्रिंग चाहते हैं ।

उपरोक्त text 'a123'एक अनकही शाब्दिक कास्ट करने का एक तरीका है। अन्य हैं:

  • डेटा टाइप कास्ट को पोस्टग्रेट करता है

प्रत्यक्ष कलाकारों के लिए json(b), Postgres वैध JSON शाब्दिक (डबल-उद्धृत स्ट्रिंग्स के साथ ) की उम्मीद करता है :

SELECT '"a123"'::jsonb;  

प्रत्येक मान को एक विशिष्ट JSON आदिम में अनुवाद करने के लिए, आप रूपांतरण से पहले सशर्त रूप से कास्ट कर सकते हैं। उदाहरण:

SELECT p, CASE WHEN i>2 THEN to_jsonb(p::numeric) ELSE to_jsonb(p) END AS x
FROM   unnest('{ab,12,12,1.2}'::text[]) WITH ORDINALITY t(p,i);

select '"a123"'::text::jsonb = BAD स्ट्रिंग क्योंकि उद्धृत

सटीक होने के लिए, परिणाम एक स्ट्रिंग नहीं है, बल्कि jsonbJSON स्ट्रिंग युक्त मान है। स्ट्रिंग को पोस्टग्रेज डेटा प्रकार के रूप में प्राप्त करने के लिए text, आपको ->>ऑपरेटर की आवश्यकता होगी :

select 'a123'::text  = ('{"x":"a123"}'::jsonb)->>'x'

या (JSON मूल्यों की तुलना):

select '"a123"'::jsonb = ('{"x":"a123"}'::jsonb)->'x';

मुझे शुद्ध JSONb स्ट्रिंग्स के रूप में '123' और 'a123' की आवश्यकता है।

इसलिए:

SELECT '"123"'::jsonb, '"a123"'::jsonb;

दोनों में JSON स्ट्रिंग्स हैं

यह भी काम करता है:

SELECT '123'::jsonb;

.. लेकिन इसमें JSON संख्यात्मक होता है

लेकिन यह काम नहीं करता है:

SELECT 'a123'::jsonb;  -- error

.. क्योंकि यह एक मान्य संख्यात्मक शाब्दिक नहीं है।

मैनुअल में JSON प्राइमिटिव टाइप और कॉरेस्पॉन्डिंग पोस्टग्रेक्यूएल टाइप्स के बीच मैपिंग की एक तालिका है