SQL सर्वर के साथ JSON का उपयोग करते समय, आप JSON_VALUE() . का उपयोग कर सकते हैं JSON स्ट्रिंग से एक अदिश मान लौटाने का कार्य करता है।
इस फ़ंक्शन का उपयोग करने के लिए, आप दो तर्क प्रदान करते हैं; JSON व्यंजक, और निकालने के लिए गुण।
सिंटैक्स
वाक्य रचना इस प्रकार है:
JSON_VALUE ( expression , path )
जहां expression JSON स्ट्रिंग एक्सप्रेशन है, और path वह संपत्ति है जिसे आप उस अभिव्यक्ति से निकालना चाहते हैं।
पथ तर्क में एक वैकल्पिक पथ मोड . शामिल हो सकता है अवयव। यह वैकल्पिक पथ मोड या तो lax . का मान हो सकता है या strict . यह मान, यदि कोई हो, डॉलर चिह्न से पहले आता है।
उदाहरण 1 - मूल उपयोग
JSON_VALUE() . के मूल उपयोग को प्रदर्शित करने के लिए यहां एक उदाहरण दिया गया है समारोह।
SELECT JSON_VALUE('{"Name": "Bruce"}', '$.Name') AS 'Result';
परिणाम:
+----------+ | Result | |----------| | Bruce | +----------+
इस उदाहरण में:
- द
{"Name": "Bruce"}तर्क JSON अभिव्यक्ति है (एक छोटा सा, लेकिन फिर भी एक वैध JSON अभिव्यक्ति)। JSON अभिव्यक्तियों में एक कुंजी/मान जोड़ी होती है। इस मामले में,Nameकुंजी है,Bruceइसका मूल्य है। - द
$.Nameतर्क पथ है। यह पथName. के मान का संदर्भ देता है JSON अभिव्यक्ति की कुंजी। इसलिए हम जोड़ी के नाम को संदर्भित करके मान निकाल सकते हैं।
उदाहरण 2 - सरणी
किसी सरणी से कोई मान निकालने के लिए, उसके सूचकांक को वर्गाकार कोष्ठकों में देखें, उसके बाद संबंधित कुंजी। यहां एक उदाहरण दिया गया है:
/*
CREATE THE ARRAY (and put into a variable called @data)
*/
DECLARE @data NVARCHAR(4000)
SET @data=N'{
"Cities": [
{
"Name": "Kabul",
"CountryCode": "AFG",
"District": "Kabol",
"Population": 1780000
},
{
"Name": "Qandahar",
"CountryCode": "AFG",
"District": "Qandahar",
"Population": 237500
}
]
}'
/*
QUERY THE ARRAY
*/
SELECT
JSON_VALUE(@data,'$.Cities[0].Name') AS 'Name',
JSON_VALUE(@data,'$.Cities[0].CountryCode') AS 'Country Code',
JSON_VALUE(@data,'$.Cities[0].District') AS 'District',
JSON_VALUE(@data,'$.Cities[0].Population') AS 'Population'
UNION ALL
SELECT
JSON_VALUE(@data,'$.Cities[1].Name') AS 'Name',
JSON_VALUE(@data,'$.Cities[1].CountryCode') AS 'Country Code',
JSON_VALUE(@data,'$.Cities[1].District') AS 'District',
JSON_VALUE(@data,'$.Cities[1].Population') AS 'Population';
परिणाम:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
तो इस उदाहरण में, हम एक JSON सरणी बनाते हैं और इसे @data . नामक एक वेरिएबल में डालते हैं . फिर हम @data . का उपयोग करके एक क्वेरी चलाते हैं JSON_VALUE() . के पहले तर्क के रूप में फ़ंक्शन (ऐसा इसलिए है क्योंकि @data JSON अभिव्यक्ति शामिल है)।
एरेज़ शून्य-आधारित नंबरिंग का उपयोग करते हैं, इसलिए पहला आइटम निकालने के लिए हमें Cities[0] का उपयोग करना होगा , दूसरा वाला Cities[1] , और इसी तरह।
उदाहरण 3 - एक डेटाबेस उदाहरण
यदि हम पिछले उदाहरण के डेटा को डेटाबेस में डालते हैं, तो हम क्वेरी को निम्नानुसार फिर से लिख सकते हैं:
SELECT JSON_VALUE(Document,'$.Cities[0].Name') AS 'Name', JSON_VALUE(Document,'$.Cities[0].CountryCode') AS 'Country Code', JSON_VALUE(Document,'$.Cities[0].District') AS 'District', JSON_VALUE(Document,'$.Cities[0].Population') AS 'Population' FROM Json_Documents UNION ALL SELECT JSON_VALUE(Document,'$.Cities[1].Name') AS 'Name', JSON_VALUE(Document,'$.Cities[1].CountryCode') AS 'Country Code', JSON_VALUE(Document,'$.Cities[1].District') AS 'District', JSON_VALUE(Document,'$.Cities[1].Population') AS 'Population' FROM Json_Documents
परिणाम:
+----------+----------------+------------+--------------+ | Name | Country Code | District | Population | |----------+----------------+------------+--------------| | Kabul | AFG | Kabol | 1780000 | | Qandahar | AFG | Qandahar | 237500 | +----------+----------------+------------+--------------+
यह मानता है कि JSON दस्तावेज़ Document . नामक कॉलम में संग्रहीत है , जो Json_Documents . नामक तालिका में है ।
उदाहरण 4 - पथ मोड
जैसा कि बताया गया है, आपके पास पथ मोड निर्दिष्ट करने का विकल्प भी है। यह या तो lax हो सकता है या strict ।
पथ मोड का मान निर्धारित करता है कि पथ व्यंजक में त्रुटि होने पर क्या होता है। विशेष रूप से:
- ढीले . में मोड, यदि पथ अभिव्यक्ति में कोई त्रुटि है, तो फ़ंक्शन खाली मान देता है। उदाहरण के लिए, अगर आप मान $.name . का अनुरोध करते हैं , और JSON टेक्स्ट में कोई नाम . नहीं है कुंजी, फ़ंक्शन शून्य लौटाता है, लेकिन कोई त्रुटि उत्पन्न नहीं करता है।
-
सख्त . में मोड, यदि पथ अभिव्यक्ति में कोई त्रुटि है, तो फ़ंक्शन एक त्रुटि उत्पन्न करता है।
डिफ़ॉल्ट मान lax है ।
इन दो मोड के बीच अंतर को प्रदर्शित करने के लिए यहां एक उदाहरण दिया गया है।
ढीला मोड में त्रुटि
यहां बताया गया है कि जब लैक्स मोड में पाथ एक्सप्रेशन में त्रुटि होती है तो क्या होता है।
SELECT JSON_VALUE('{"Name": "Bruce"}', 'lax $.Hobbies') AS 'Result';
परिणाम:
+----------+ | Result | |----------| | NULL | +----------+
इस उदाहरण में हम Hobbies . को संदर्भित करने का प्रयास कर रहे हैं , लेकिन वह कुंजी JSON दस्तावेज़ में मौजूद नहीं है। इस मामले में हमें एक शून्य मान मिलता है (क्योंकि हम लैक्स मोड का उपयोग कर रहे हैं)।
सख्त मोड में त्रुटि
जब हम समान कोड को स्ट्रिक्ट मोड में चलाते हैं तो यहां क्या होता है।
SELECT JSON_VALUE('{"Name": "Bruce"}', 'strict $.Hobbies') AS 'Result';
परिणाम:
Msg 13608, Level 16, State 1, Line 1 Property cannot be found on the specified JSON path.
जैसा कि अपेक्षित था, सख्त मोड के परिणामस्वरूप एक त्रुटि संदेश प्रदर्शित हो रहा है।
उदाहरण 5 - लौटने वाली वस्तुएं और सरणी
JSON_VALUE() फ़ंक्शन ऑब्जेक्ट और सरणियों को वापस नहीं करता है। यदि आप किसी वस्तु या सरणी को वापस करना चाहते हैं, तो JSON_QUERY() . का उपयोग करें इसके बजाय कार्य करें। यहां एक उदाहरण दिया गया है जहां मैं एक क्वेरी के भीतर दोनों कार्यों का उपयोग करता हूं।
DECLARE @data NVARCHAR(4000)
SET @data=N'{
"Suspect": {
"Name": "Homer Simpson",
"Address": {
"City": "Mae Sai",
"Province": "Chiang Rai",
"Country": "Thailand"
},
"Hobbies": ["Eating", "Sleeping", "Base Jumping"]
}
}'
SELECT
JSON_VALUE(@data,'$.Suspect.Name') AS 'Name',
JSON_VALUE(@data,'$.Suspect.Address.Country') AS 'Country',
JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'Hobbies',
JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'Last Hobby';
परिणाम:
+---------------+-----------+----------------------------------------+--------------+ | Name | Country | Hobbies | Last Hobby | |---------------+-----------+----------------------------------------+--------------| | Homer Simpson | Thailand | ["Eating", "Sleeping", "Base Jumping"] | Base Jumping | +---------------+-----------+----------------------------------------+--------------+
इस मामले में, मैं JSON_VALUE() . का उपयोग करता हूं विभिन्न अदिश मान लौटाने के लिए, और JSON_QUERY() एक सरणी वापस करने के लिए।
इसलिए यदि आपको किसी वस्तु या सरणी (संपूर्ण JSON दस्तावेज़ सहित) को वापस करने की आवश्यकता है, तो देखें JSON_QUERY() SQL सर्वर में उदाहरण।