देखें कि क्या MySQL में JSON सरणी में कोई ऑब्जेक्ट है जिसकी कुंजी एक विशिष्ट तिथि रखती है


18

मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या कोई पंक्ति है जिसमें JSON सरणी के अंदर एक विशिष्ट दिनांक है

मान लीजिए कि मेरा डेटा इस तरह दिखता है:

तालिका अनुप्रयोग:

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"

जो सही तरीके से id 4 के साथ पंक्ति को लौटाता है।

लेकिन अगर मैं रास्ते में एक वाइल्डकार्ड का उपयोग करने की कोशिश करता हूं तो यह अब काम नहीं करता है:

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

इसे 2, 3, 4 पंक्तियों को वापस करना चाहिए।

मैंने कई अन्य विकल्पों / विविधताओं की कोशिश की, लेकिन मैं क्वेरी को सही ढंग से संरचना करने का कोई तरीका नहीं खोज सकता।

क्या MySQL JSON के वर्तमान कार्यान्वयन के साथ भी ऐसा कुछ संभव है?

जवाबों:


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, "$ [0] .date") अनुप्रयोगों से 'दिनांक' के रूप में, से- id, json_extract ( data, "$ [1] .date") अनुप्रयोगों से 'दिनांक' के रूप में, और सभी फ़िल्टर लागू करने के लिए आदि। और आईडी की सूची है
a_vlad

आपने मुझे json_contains सिंटैक्स का उपयोग करने के तरीके के बारे में एक सुराग दिया
जिमी इलेनॉला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.