আমার একটি টেবিল persons
রয়েছে, যার মধ্যে দুটি কলাম রয়েছে, একটি id
এবং একটি জেএসওএনবি ভিত্তিক data
কলাম (এই টেবিলটি পোস্টগ্র্রেএসকিউএলএর জেএসওএন সমর্থন সমর্থন করে প্রদর্শনের উদ্দেশ্যে তৈরি করা হয়েছে)।
এখন, এটিতে দুটি রেকর্ড রয়েছে বলে মনে করা হচ্ছে:
1, { name: 'John', age: 30 }
2, { name: 'Jane', age: 20 }
এখন, অনুমিত হয়ে আমি 25 বছরেরও বেশি বয়স্ক প্রত্যেক ব্যক্তির নাম পেতে চাই I আমি যা চেষ্টা করেছি তা হ'ল:
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
জেএসওএন নথির ধরণটি number
যাইহোক, তাই পোস্টগ্র্রেএসকিউএল কেন এটি নিজেই খুঁজে বের করতে পারে না?)।
আমি তখন বুঝতে পেরেছি যে আমি যদি সিনট্যাক্সটি 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'
এটি একটি ত্রুটিতে ফলাফল:
টাইপ জসনের জন্য অবৈধ ইনপুট সিনট্যাক্স
খুব সম্ভবত স্পষ্টতই, আমি এখানে কিছু পাই না। দুর্ভাগ্যক্রমে, পোস্টগ্র্রেএসকিউএল সহ জেএসএন ব্যবহার করার কোনও বাস্তব-বিশ্বের উদাহরণ খুঁজে পাওয়া বেশ কঠিন।
কোন ইঙ্গিত?
'Jenny'
সঙ্গে '"Jenny"'
।
data->'name'::text
, আপনি'name'
টেক্সটে স্ট্রিং কাস্ট করছেন, ফলাফল নয়। আপনি একটি ত্রুটি তুলনায় পাবেন না'25'
কারণ25
একটি বৈধ JSON আক্ষরিক হয়; তবেJenny
তা নয় (যদিও"Jenny"
হবে)।