मारियाडीबी में, JSON_VALUE()
फ़ंक्शन और JSON_QUERY()
फ़ंक्शन समान कार्य करते हैं - वे JSON दस्तावेज़ से डेटा लौटाते हैं।
तो क्या अंतर है?
मुख्य अंतर यह है कि JSON_VALUE()
अदिश मान देता है, जबकि JSON_QUERY()
सरणियों और वस्तुओं को लौटाता है।
परिभाषाएं
JSON दस्तावेज़ को देखते हुए, प्रत्येक फ़ंक्शन निम्न कार्य करता है:
JSON_VALUE()
पथ द्वारा निर्दिष्ट अदिश लौटाता है।JSON_QUERY()
पथ द्वारा निर्दिष्ट एक वस्तु या सरणी देता है।
मेरी समझ यह है कि यह SQL मानक के कारण इस तरह से काम करता है।
अगर इससे आपको समस्या होती है, तो आपको JSON_EXTRACT()
. मिल सकता है अधिक उपयोगी कार्य करते हैं।
स्केलर
जब हम JSON दस्तावेज़ से स्केलर निकालने के लिए दोनों फ़ंक्शन का उपयोग करने का प्रयास करते हैं, तो क्या होता है, यह प्रदर्शित करने के लिए यहां एक उदाहरण दिया गया है।
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.name') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.name') AS JSON_QUERY;
परिणाम:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Rufus | NULL | +------------+------------+
JSON_VALUE()
उम्मीद के मुताबिक अदिश लौटा दी, लेकिन JSON_QUERY()
लौटा NULL
. यह अपेक्षित है, क्योंकि JSON_QUERY()
केवल सरणियों और वस्तुओं को लौटाता है।
यदि हम सरणी से अदिश डेटा वापस करने का प्रयास करते हैं तो यह वही परिणाम है:
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.awards[0]') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.awards[0]') AS JSON_QUERY;
परिणाम:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Top Dog | NULL | +------------+------------+
ऑब्जेक्ट
यहाँ क्या होता है जब हम एक संपूर्ण वस्तु को वापस करने के लिए दोनों कार्यों का उपयोग करने का प्रयास करते हैं:
SET @json_document = '{ "name" : "Rufus" }';
SELECT
JSON_VALUE(@json_document, '$') AS JSON_VALUE,
JSON_QUERY(@json_document, '$') AS JSON_QUERY;
परिणाम:
+------------+----------------------+ | JSON_VALUE | JSON_QUERY | +------------+----------------------+ | NULL | { "name" : "Rufus" } | +------------+----------------------+
इस बार यह है JSON_QUERY()
फ़ंक्शन जो सफल होता है।
सरणी
यहाँ क्या होता है जब हम एक संपूर्ण सरणी को वापस करने के लिए दोनों कार्यों का उपयोग करने का प्रयास करते हैं:
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.awards') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.awards') AS JSON_QUERY;
परिणाम:
+------------+------------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------------+ | NULL | [ "Top Dog", "Best Dog", "Biggest Dog" ] | +------------+------------------------------------------+
फिर से, JSON_QUERY()
समारोह सफल हुआ।
हालांकि, जब हम सरणी से सभी स्केलर तत्वों का चयन करने के लिए सरणी वाइल्डकार्ड ऑपरेटर का उपयोग करते हैं, तो कोई भी फ़ंक्शन सफल नहीं होता है। इस मामले में, JSON_EXTRACT()
बचाव के लिए आता है:
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.awards[*]') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.awards[*]') AS JSON_QUERY,
JSON_EXTRACT(@json_document, '$.awards[*]') AS JSON_EXTRACT;
परिणाम:
+------------+------------+----------------------------------------+ | JSON_VALUE | JSON_QUERY | JSON_EXTRACT | +------------+------------+----------------------------------------+ | Top Dog | NULL | ["Top Dog", "Best Dog", "Biggest Dog"] | +------------+------------+----------------------------------------+
हालाँकि, यदि सरणी के तत्व सरणियाँ या ऑब्जेक्ट हैं, तो JSON_QUERY()
उन्हें ठीक लौटाता है:
SET @json_document = '
{
"name" : "Rufus",
"scores" : [ [1, 2, 3], [8, 9], { "a" : 1 } ]
}
';
SELECT
JSON_VALUE(@json_document, '$.scores') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.scores') AS JSON_QUERY;
परिणाम:
+------------+------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------+ | NULL | [ [1, 2, 3], [8, 9], { "a" : 1 } ] | +------------+------------------------------------+