মাইএসকিউএলে কোনও জেএসওএন অ্যারেতে এমন কোনও বিষয় রয়েছে কিনা যার কীটির একটি নির্দিষ্ট তারিখ রয়েছে See


18

আমি জেসন অ্যারের অভ্যন্তরে নির্দিষ্ট তারিখ রয়েছে এমন কোনও সারি রয়েছে কিনা তা জানার চেষ্টা করছি

আসুন বলি যে আমার ডেটা দেখতে এমন দেখাচ্ছে:

সারণী অ্যাপ্লিকেশন:

id | application_id | data
# Rows
1 | 1 | [{"data" : ["some", "data#1"], "date": "2016-04-21"}, {"data" : ["other", "data#1"], "date" : "2016-04-22"}]
2 | 2 | [{"data" : ["some", "data#2"], "date": "2016-04-21"}, {"data" : ["other", "data#2"], "date" : "2016-04-26"}]
3 | 1 | [{"data" : ["some", "data#3"], "date": "2016-04-22"}, {"data" : ["other", "data#3"], "date" : "2016-04-26"}]
4 | 3 | [{"data" : ["some", "data#4"], "date": "2016-04-26"}]

যাদের ডেটাতে তারিখ রয়েছে সে সব অ্যাপ্লিকেশন আমি কীভাবে খুঁজে পাব '2016-04-26'?

সুতরাং মূলত আমি এটি করতে পারি:

select id, json_extract(`data`, "$[*].date") from applications

যা ফেরত:

1 | ["2016-04-21", "2016-04-22"]
2 | ["2016-04-21", "2016-04-26"]
3 | ["2016-04-22", "2016-04-26"]
4 | ["2016-04-26"]

তবে যদি json_extractএই WHEREধারাটিতে ব্যবহার করার চেষ্টা করা হয় তবে আমি কেবল তখনই এটি ব্যবহার করতে পারি যদি আমি স্পষ্টভাবে json_extractরাস্তার যুক্তিতে অ্যারের কীটি বলি , যেমন:

select * from applications where json_extract(`data`, "$[0].date") = "2016-04-26"

যা সঠিকভাবে আইডি 4 সহ সারিটি প্রদান করে।

তবে আমি যদি পথে কোনও ওয়াইল্ডকার্ড ব্যবহার করার চেষ্টা করি তবে এটি আর কাজ করে না:

select * from applications where json_extract(`data`, "$[*].date") = "2016-04-26"

এটি 2, 3, 4 সারিগুলি ফিরিয়ে আনবে।

আমি অন্যান্য অনেকগুলি বিকল্প / বৈকল্পিক চেষ্টা করেছি কিন্তু কোয়েরিটি সঠিকভাবে গঠন করার উপায় খুঁজে পাচ্ছি না।

মাইএসকিউএল জেএসএনের বর্তমান বাস্তবায়নের মাধ্যমে কি এরকম কিছু সম্ভব?

উত্তর:


15

মরগান টাকার দ্বারা প্রদত্ত একটি সমাধান - @ এমরোগো এটির json_containsমতো ব্যবহার করতে হবে :

select * from applications where json_contains(`data`, '{"date" : "2016-04-26"}')

আপাতত উত্তরটি ঠিক আছে তবে আমি বিশ্বাস করি এটির কিছু পারফরম্যান্স সমস্যা হতে পারে এবং আমার কাছে কিছুটা হ্যাশ লাগছে (পরবর্তী প্রশ্নটি দেখুন) - তবে আমি যখন সেখানে পৌঁছব তখন আমি তাদের সাথেই আচরণ করব :)

যদি আমাকে কোনও তারিখের সীমাতে জিজ্ঞাসা করতে হয় (থেকে শুরু 2016-04-24করে 2016-04-26) তবে সময়কালে json_containsপ্রতিটি দিনের জন্য আমাকে একটি অদৃশ্য যোগ করতে হবে :

select * from applications where json_contains(`data`, '{"date" : "2016-04-26"}') or json_contains(`data`, '{"date" : "2016-04-25"}') or json_contains(`data`, '{"date" : "2016-04-24"}')

এবং যদি আমার dateঅন্য কোথাও বাসা বাঁধার কী থাকে তবে এটি অবৈধ ডেটা ফেরত দেবে

সুতরাং আপনার যদি অন্যরকম সমাধান হয় তবে আমি তা জানতে চাই


ভেরিয়েন্ট হিসাবে - তারিখের অ্যারের সর্বাধিক গভীরতার সংজ্ঞা দিন - সঞ্চিত পদ্ধতিতে লুপের চেয়ে টেম্প টেবিলগুলিতে আইডি এবং নির্বাচিত তারিখ - আইডি নির্বাচন করুন, নির্বাচন করুন MAX (json_depth (ডেটা - >> '$ [*]। তারিখ'))) json_extract ( data, " j [0]। তারিখ") অ্যাপ্লিকেশন থেকে 'তারিখ' হিসাবে বেছে নিন, আইডি নির্বাচন করুন, json_extract ( data, "$ [1]। তারিখ") অ্যাপ্লিকেশন থেকে 'তারিখ' হিসাবে বেছে নিন এবং সমস্ত ফিল্টার প্রয়োগ করুন এবং আইডি তালিকা রয়েছে
a_vlad

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