নতুন পোস্টগ্র্যাসকিউএল জেএসএন ডেটাটাইপের অভ্যন্তরে ক্ষেত্রগুলি ব্যবহার করে আমি কীভাবে জিজ্ঞাসা করব?


216

পোস্টগ্র্রেএসকিউএল 9.2-এ নতুন জেএসএন ফাংশনের জন্য আমি কিছু দস্তাবেজ এবং / অথবা উদাহরণগুলি খুঁজছি।

বিশেষত, JSON রেকর্ডগুলির একটি সিরিজ দেওয়া:

[
  {name: "Toby", occupation: "Software Engineer"},
  {name: "Zaphod", occupation: "Galactic President"}
]

আমি কীভাবে এসকিউএল লিখব নাম দিয়ে একটি রেকর্ড খুঁজতে?

ভ্যানিলা এসকিউএল এ:

SELECT * from json_data WHERE "name" = "Toby"

অফিসিয়াল দেব ম্যানুয়ালটি বেশ বিরল:

আপডেট আমি

পোস্টগ্র্রেএসকিউএল 9.2 এর মাধ্যমে বর্তমানে কী সম্ভব তা বিশদ বিবরণে আমি একটি সংক্ষিপ্তসার রেখেছি । কিছু কাস্টম ফাংশন ব্যবহার করে যেমন করা সম্ভব:

SELECT id, json_string(data,'name') FROM things
WHERE json_string(data,'name') LIKE 'G%';

আপডেট দ্বিতীয়

আমি এখন আমার JSON ফাংশনগুলিকে তাদের নিজস্ব প্রকল্পে স্থানান্তরিত করেছি:

পোস্টএসকিউএল - পোস্টগ্রেএসকিউএল এবং পিএল / ভি 8 কে পুরোপুরি দুর্দান্ত এক জাসন ডকুমেন্ট স্টোরে রূপান্তর করার জন্য ফাংশনের একটি সেট


3
সাম্প্রতিককালে আমি ম্যাট শিনকেলের এই ব্লগ পোস্টটি পেয়েছি, যা পোস্টগ্রেএসকিউএল স্কিঙ্কেল.না.২০৪
২০১25 /

1
@ জনাব এই পোস্টটি আসলে জেএসওএনবিকে জিজ্ঞাসাবাদ করার বিষয়ে, যা জেএসএন থেকে একেবারেই আলাদা। পোস্টে আরও পরিষ্কার না করার জন্য আমার খারাপ।
ম্যাথু শিনকেল

উত্তর:


177

পোস্টগ্রিজ 9.2

আমি পিজেএসকিএল-হ্যাকারদের তালিকায় অ্যান্ড্রু ডানস্তানকে উদ্ধৃত করেছি :

কিছু পর্যায়ে সম্ভবত কিছু জসন-প্রসেসিং (জসন উত্পাদনের বিপরীতে) ফাংশন হবে, তবে 9.2-এ নয়।

PLV8 এ এমন একটি বাস্তবায়ন প্রদান থেকে তাকে বাধা দেয় না যা আপনার সমস্যার সমাধান করতে পারে।

পোস্টগ্রিজ 9.3

"জসন-প্রসেসিং" যুক্ত করতে নতুন ফাংশন এবং অপারেটরদের একটি অস্ত্রাগার অফার করে।

পোস্টগ্রিস 9.3 এ মূল প্রশ্নের উত্তর :

SELECT *
FROM   json_array_elements(
  '[{"name": "Toby", "occupation": "Software Engineer"},
    {"name": "Zaphod", "occupation": "Galactic President"} ]'
  ) AS elem
WHERE elem->>'name' = 'Toby';

উন্নত উদাহরণ:

বড় টেবিলগুলির জন্য আপনি কর্মক্ষমতা বাড়ানোর জন্য একটি এক্সপ্রেশন সূচক যুক্ত করতে চাইতে পারেন:

পোস্টগ্রিজ 9.4

যোগ করুন jsonb("বাইনারি" এর জন্য খ, মানগুলি পোস্টগ্রিজের ধরণ হিসাবে সংরক্ষণ করা হয়) এবং উভয় প্রকারের জন্য আরও কার্যকারিতা । উপরে বর্ণিত এক্সপ্রেশন সূচকগুলি ছাড়াও , জিআইএন, বিটি ও হ্যাশ সূচকগুলিকেjsonb সমর্থন করে , জিআইএন এগুলির মধ্যে সবচেয়ে শক্তিশালী।

ম্যানুয়ালটি যতদূর প্রস্তাব দেয়:

সাধারণভাবে, বেশিরভাগ অ্যাপ্লিকেশনগুলিকে জেএসএন ডেটা সংরক্ষণ করতে পছন্দ করা উচিত jsonb , যদি না বেশ কয়েকটি বিশেষ চাহিদা থাকে যেমন অবজেক্ট কীগুলি অর্ডার করার বিষয়ে উত্তরাধিকার অনুমান।

বোল্ড জোর আমার।

জিআইএন সূচকগুলিতে সাধারণ উন্নতি থেকে পারফরম্যান্সের সুবিধা।

পোস্টগ্রাগেস 9.5

সম্পূর্ণ jsonbফাংশন এবং অপারেটরগুলি। jsonbজায়গায় এবং প্রদর্শনের জন্য কারসাজি করতে আরও ফাংশন যুক্ত করুন ।


1
ধন্যবাদ, আমি PLV8 পদ্ধতির সাহায্যে খুব দ্রুত টাইপ ইস্যুগুলিতে চলে এসেছি। প্রতিশ্রুতিবদ্ধ মনে হচ্ছে, তবে এই মুহূর্তে সত্যই ব্যবহারযোগ্য নয়।
টবি হেড

@ টবিহাইড: অনুমান করুন আমাদের তখন 9.3 অপেক্ষা করতে হবে।
এরউইন ব্র্যান্ডস্টেটার

1
@ জোশওয়া: ধন্যবাদ, আমি সে অনুযায়ী আপডেট করেছি এবং পোস্টগ্রিস উইকিতে একটি লিঙ্ক যুক্ত করেছি।
এরউইন ব্র্যান্ডস্টেটার

@ ইরুইন ব্র্যান্ডসটেটার যদি আমি কোথায় এলিমে খুঁজছি - >> 'সঠিক' = 'সত্য'; এবং JSON এর মতো দেখাচ্ছে: "সঠিক": "সত্য", যৌক্তিক পদগুলি জিজ্ঞাসা করার সঠিক উপায় কী?
শিরাজ

@ শিরাজ: দয়া করে নতুন প্রশ্নগুলি প্রশ্ন হিসাবে জিজ্ঞাসা করুন । মন্তব্য জায়গা নয়।
এরউইন ব্র্যান্ডসেটেটার

87

পোস্টগ্রিস 9.3+ সহ, কেবল ->অপারেটরটি ব্যবহার করুন । উদাহরণ স্বরূপ,

SELECT data->'images'->'thumbnail'->'url' AS thumb FROM instagram;

দেখতে http://clarkdave.net/2013/06/what-can-you-do-with-postgresql-and-json/ কিছু চমৎকার উদাহরণ এবং একটি টিউটোরিয়াল জন্য।


2
উদাহরণে আপনি একটি ক্ষেত্র নামে থাকা উচিত উপরে dataএকটি JSON- ডকুমেন্ট সাথে {images:{thumbnail:{url:'thumbnail.jpg'}}}। আপনার ডেটা কেমন দেখাচ্ছে এবং কোন ক্যোয়ারী ব্যর্থ হচ্ছে তা আমাদের জানান।
মেকোহি


6
অ্যারে থাকলে আপনি কীভাবে জিজ্ঞাসা করতে পারেন? আমি # >> অপারেটর দেখছি তবে এটি কীভাবে ব্যবহার করা যায় তার কোনও ক্লু নেই!
মোহাম্মদ এল মহল্লভী

এই নির্বাচন করা প্রশ্নের সাথে আমি কি ওয়াইল্ডকার্ড ব্যবহার করতে পারি? অর্থাৎSELECT data->'%'->'thumbnail'->'url' AS thumb FROM instagram;
ভারত

@ মেকোহির উত্তরটি ভালভাবে কাজ করে: বিশেষত ::jsonঅন্যান্য পোস্টে বর্ণিত হিসাবে আমার প্রয়োজন হয়নি । এছাড়াও নোট করুন ->অপারেটর কোনও ত্রুটি ছুঁড়ে ফেলবে যদি আপনি এমন কোনও সম্পত্তি অ্যাক্সেস করার চেষ্টা করেন যা অস্তিত্বহীন (যেমন আপনি যদি জেএসওএনকে আটকে রেখেছেন):ERROR: column "jsonPropertyYouWant" does not exist
রেড মটর

19

পোস্টগ্রিজ 9.3 এর সাথে অবজেক্ট অ্যাক্সেসের জন্য ব্যবহার করুন -> 4 উদাহরণ

seed.rb

se = SmartElement.new
se.data = 
{
    params:
    [
        {
            type: 1,
            code: 1,
            value: 2012,
            description: 'year of producction'
        },
        {
            type: 1,
            code: 2,
            value: 30,
            description: 'length'
        }
    ]
}

se.save

রেল গ

SELECT data->'params'->0 as data FROM smart_elements;

আয়

                                 data
----------------------------------------------------------------------
 {"type":1,"code":1,"value":2012,"description":"year of producction"}
(1 row)

আপনি বাসা বাঁধতে পারেন

SELECT data->'params'->0->'type' as data FROM smart_elements;

প্রত্যাবর্তন

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