পোস্টারস 9.4-এ JSON অ্যারে উপাদান সহ json_to_record ব্যবহার করার সময় "ত্রুটি: ত্রুটিযুক্ত অ্যারে আক্ষরিক"


9

এটি বিষয়টি সুন্দরভাবে বর্ণনা করে:

কলাম বি যখন পাঠ্য টাইপের হয় এবং অ্যারে নয়, নিম্নলিখিতটি কাজ করে:

select * 
from json_to_record('{"a":1,"b":["hello", "There"],"c":"bar"}') 
    as x(a int, b text, d text);

 a |         b          | d
---+--------------------+---
 1 | ["hello", "There"] |

তবে আমি যদি bকলামটিকে অ্যারে হিসাবে সংজ্ঞায়িত করি তবে আমি এই ত্রুটিটি পেয়েছি:

select * 
from json_to_record('{"a":1,"b":["hello", "There"],"c":"bar"}') 
    as x(a int, b text[], d text)

ERROR:  malformed array literal: "["hello", "There"]"
DETAIL:  "[" must introduce explicitly-specified array dimensions.

আমি কীভাবে / জোর করে json_to_record(বা json_populate_record) কোনও JSON অ্যারেটিকে লক্ষ্য কলামের ধরণের পোস্টগ্রিস অ্যারে রূপান্তর করতে পারি ?

উত্তর:


6

ক্রিসের উত্তরের সামান্যতম পরিবর্তন:

SELECT a, translate(b, '[]', '{}')::text[] AS b, d
FROM json_to_record('{"a": 1, "b": ["hello", "There"], "c": "bar"}')
AS x(a int, b text, d text);

ধারণাটি একই রকম: JSON অ্যারেটিকে একটি অ্যারেতে ম্যাসেজ করুন - এই ক্ষেত্রে অ্যারে আক্ষরিক মাধ্যমে through কিছুটা পরিষ্কার পরিচ্ছন্ন বর্ণন কোড ছাড়াও (যদিও আমি এটি পছন্দ করি, রেজেক্স সাধারণত এই ক্ষেত্রে খুব বেশি সাহায্য করে না :), এটি খুব সামান্য দ্রুত বলে মনে হয়:

CREATE TABLE jsonb_test (
    id serial,
    data jsonb
);

INSERT INTO jsonb_test (id, data)
SELECT i, format('{"a": %s, "b": ["foo", "bar"], "c": "baz"}', i::text)::jsonb 
FROM generate_series(1,10000) t(i);

SELECT a, string_to_array(regexp_replace(b, '\[*\"*\s*\]*','','g'),',') AS b, d
FROM jsonb_test AS j, 
LATERAL json_to_record(j.data::json) AS r(a int, b text, d text);

-- versus 

SELECT a, translate(b, '[]', '{}')::text[] AS b, d
FROM jsonb_test AS j, 
LATERAL json_to_record(j.data::json) AS r(a int, b text, d text);

এই ডেটাসেটে এবং আমার পরীক্ষার বাক্সে, রেজেক্স সংস্করণটি 300 এমএসের গড় সঞ্চালনের সময় দেখায়, যখন আমার সংস্করণটি 210 এমএস দেখায় ।


1

এটি সবচেয়ে মার্জিত সমাধান নাও হতে পারে তবে এটি আপনার সমস্যার সমাধান করবে ...

SELECT a,string_to_array(regexp_replace(b, '\[*\"*\s*\]*','','g'),',') AS b,d
FROM json_to_record('{"a":1,"b":["hello", "There"],"c":"bar"}')
AS x(a int, b text, d text);

এটি কীভাবে কাজ করে তা বেশ সোজা:

প্রথম গ্রহণ textস্ট্রিং b, এবং দরকারী তথ্য এটিকে নিচে স্ট্রিপ। এটি regexp_replace()হিসাবে ব্যবহার করে করা হয়

regexp_replace(b, '\[*\"*\s*\]*','','g')

সমস্ত উদাহরণ মুছে ফেলার জন্য [, ", ], এবং যে কোনো হোয়াইটস্পেস অক্ষর, বা আরও সুনির্দিষ্টভাবে বললে সঙ্গে এই অক্ষরের কোনো দৃষ্টান্ত প্রতিস্থাপন করতে '', আর তার পতাকা ব্যবহার করে এই বিশ্বব্যাপী, সংকেত প্রয়োগ করতে 'g'

পরবর্তী , সহজভাবে ব্যবহার করে একটি অ্যারে স্ট্রিং বিভক্ত string_to_array()যেমন

string_to_array(your_string,',')

যেখানে এই ক্ষেত্রে your_stringকেবল উপরের ফলাফল regexp_replace()। দ্বিতীয় যুক্তি ','নির্দেশ করে string_to_array()যে আইটেমগুলি কমা-বিচ্ছিন্ন।

এটি text[]আপনার কাঙ্ক্ষিত এন্ট্রি সমেত একটি ক্ষেত্র উত্পাদন করবে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.