खोज…


वाक्य - विन्यास

  • JSON_VALUE (अभिव्यक्ति, पथ) - JSON स्ट्रिंग से स्केलर मान निकालें।
  • JSON_QUERY (अभिव्यक्ति [, पथ]) - एक JSON स्ट्रिंग से एक ऑब्जेक्ट या एक सरणी निकालता है।
  • OPENJSON (jsonExpression [, path]) - टेबल-वैल्यू फ़ंक्शन जो JSON टेक्स्ट को पार्स करता है और JSON में ऑब्जेक्ट्स और प्रॉपर्टीज़ को पंक्तियों और कॉलम के रूप में लौटाता है।
  • ISJSON (अभिव्यक्ति) - टेस्ट कि क्या एक स्ट्रिंग में वैध JSON है।
  • JSON_MODIFY (अभिव्यक्ति, पथ, newValue) - एक JSON स्ट्रिंग में एक संपत्ति का मूल्य अद्यतन करता है और अपडेट किया गया JSON स्ट्रिंग लौटाता है।

पैरामीटर

पैरामीटर विवरण
अभिव्यक्ति आमतौर पर एक चर या स्तंभ का नाम जिसमें JSON टेक्स्ट होता है।
पथ एक JSON पथ अभिव्यक्ति जो संपत्ति को अद्यतन करने के लिए निर्दिष्ट करती है। पथ में निम्नलिखित सिंटैक्स है: [परिशिष्ट] [लक्ष्मण | सख्त] $। <json path>
jsonExpression एक यूनिकोड वर्ण अभिव्यक्ति है जिसमें JSON टेक्स्ट है।

टिप्पणियों

OPENJSON फ़ंक्शन केवल संगतता स्तर 130 के तहत उपलब्ध है। यदि आपका डेटाबेस संगतता स्तर 130 से कम है, तो SQL सर्वर OPENJSON फ़ंक्शन को खोजने और निष्पादित करने में सक्षम नहीं होगा। वर्तमान में सभी Azure SQL डेटाबेस डिफ़ॉल्ट रूप से 120 पर सेट हैं। आप निम्न आदेश का उपयोग करके डेटाबेस के संगतता स्तर को बदल सकते हैं:

ALTER DATABASE <Database-Name-Here> SET COMPATIBILITY_LEVEL = 130

JSON के लिए JSON के रूप में क्वेरी परिणाम स्वरूपित करें

इनपुट टेबल डेटा (पीपल टेबल)

ईद नाम आयु
1 जॉन 23
2 जेन 31

सवाल

SELECT Id, Name, Age
FROM People
FOR JSON PATH

परिणाम

[
    {"Id":1,"Name":"John","Age":23},
    {"Id":2,"Name":"Jane","Age":31}
]

पार्स जोंस पाठ

JSON_VALUE और JSON_QUERY, JSON पाठ को पार्स करते हैं और JSON पाठ में पथ पर स्केलर मान या ऑब्जेक्ट / सरणियाँ लौटाते हैं।

DECLARE @json NVARCHAR(100) = '{"id": 1, "user":{"name":"John"}, "skills":["C#","SQL"]}'

SELECT
    JSON_VALUE(@json, '$.id') AS Id,
    JSON_VALUE(@json, '$.user.name') AS Name,
    JSON_QUERY(@json, '$.user') AS UserObject,
    JSON_QUERY(@json, '$.skills') AS Skills,
    JSON_VALUE(@json, '$.skills[0]') AS Skill0

परिणाम

ईद नाम UserObject कौशल Skill0
1 जॉन { "नाम": "जॉन"} [ "सी #", "एसक्यूएल"] सी#

पैर और बच्चे जॉन्स संस्थाओं में शामिल हों जो क्रॉप एपीपीजेजेन्सन का उपयोग कर रहे हैं

माता-पिता की वस्तुओं को उनकी बाल संस्थाओं के साथ मिलाएं, उदाहरण के लिए हम प्रत्येक व्यक्ति और उनके शौक की संबंधपरक तालिका चाहते हैं

DECLARE @json nvarchar(1000) =
N'[
    {
        "id":1,
        "user":{"name":"John"},
        "hobbies":[
            {"name": "Reading"},
            {"name": "Surfing"}
        ]
    },
    {
        "id":2,
        "user":{"name":"Jane"},
        "hobbies":[
            {"name": "Programming"},
            {"name": "Running"}
        ]
    }
 ]'

सवाल

SELECT 
    JSON_VALUE(person.value, '$.id') as Id,
    JSON_VALUE(person.value, '$.user.name') as PersonName,
    JSON_VALUE(hobbies.value, '$.name') as Hobby
FROM OPENJSON (@json) as person
    CROSS APPLY OPENJSON(person.value, '$.hobbies') as hobbies

वैकल्पिक रूप से यह क्वेरी विद क्लॉज़ का उपयोग करके लिखी जा सकती है।

SELECT 
    Id, person.PersonName, Hobby
FROM OPENJSON (@json)
WITH(
    Id int '$.id',
    PersonName nvarchar(100) '$.user.name',
    Hobbies nvarchar(max) '$.hobbies' AS JSON
) as person
CROSS APPLY OPENJSON(Hobbies)
WITH(
    Hobby nvarchar(100) '$.name'
)

परिणाम

ईद PERSONNAME शौक
1 जॉन पढ़ना
1 जॉन सर्फ़िंग
2 जेन प्रोग्रामिंग
2 जेन चल रहा है

गणना कॉलम का उपयोग करके JSON गुणों पर सूचकांक

SQL सर्वर में JSON दस्तावेज़ों को संग्रहीत करते समय, हमें JSON दस्तावेज़ों के गुणों पर कुशलतापूर्वक क्वेरी परिणामों को फ़िल्टर और सॉर्ट करने में सक्षम होना चाहिए।

CREATE TABLE JsonTable
(
    id int identity primary key,
    jsonInfo nvarchar(max),
    CONSTRAINT [Content should be formatted as JSON]
    CHECK (ISJSON(jsonInfo)>0)
)
INSERT INTO JsonTable
VALUES(N'{"Name":"John","Age":23}'),
(N'{"Name":"Jane","Age":31}'),
(N'{"Name":"Bob","Age":37}'),
(N'{"Name":"Adam","Age":65}')
GO

उपरोक्त सारणी को देखते हुए यदि हम पंक्ति को '' आदम '' नाम से खोजना चाहते हैं, तो हम निम्नलिखित क्वेरी को निष्पादित करेंगे।

SELECT * 
FROM JsonTable Where 
JSON_VALUE(jsonInfo, '$.Name') = 'Adam'

हालाँकि इसके लिए एसक्यूएल सर्वर को एक पूर्ण तालिका का प्रदर्शन करना होगा जो कि एक बड़ी मेज पर प्रभावी नहीं है।

इसे गति देने के लिए हम एक इंडेक्स जोड़ना चाहेंगे, हालांकि हम सीधे JSON डॉक्यूमेंट में प्रॉपर्टी को रेफर नहीं कर सकते। समाधान JSON पथ $.Name पर एक संगणित स्तंभ जोड़ने के लिए है। फिर, गणना किए गए स्तंभ पर एक सूचकांक जोड़ें।

ALTER TABLE JsonTable
ADD vName as JSON_VALUE(jsonInfo, '$.Name')

CREATE INDEX idx_name
ON JsonTable(vName)

अब जब हम एक ही क्वेरी को निष्पादित करते हैं, तो एक पूर्ण तालिका स्कैन के बजाय SQL सर्वर गैर-संकुल सूचकांक में तलाश करने के लिए एक सूचकांक का उपयोग करता है और उन पंक्तियों को ढूंढता है जो निर्दिष्ट शर्तों को पूरा करते हैं।

नोट: अनुक्रमणिका का उपयोग करने के लिए SQL सर्वर के लिए, आपको अपने प्रश्नों में उपयोग की जाने वाली उसी अभिव्यक्ति के साथ गणना कॉलम बनाना होगा - इस उदाहरण में JSON_VALUE(jsonInfo, '$.Name') , हालाँकि आप नाम का उपयोग भी कर सकते हैं। कंप्यूटेड कॉलम vName

JSON के लिए एकल JSON ऑब्जेक्ट के रूप में एक तालिका पंक्ति को प्रारूपित करें

JSON खंड के लिए with_ARRAY_WRAPPER विकल्प JSON आउटपुट से सरणी कोष्ठक हटा देगा। यदि आप क्वेरी में एकल पंक्ति लौटा रहे हैं तो यह उपयोगी है।

नोट: यदि एक से अधिक पंक्ति लौटा दी जाती है तो यह विकल्प अमान्य JSON आउटपुट उत्पन्न करेगा।

इनपुट टेबल डेटा (पीपल टेबल)

ईद नाम आयु
1 जॉन 23
2 जेन 31

सवाल

SELECT Id, Name, Age
FROM People
WHERE Id = 1
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER

परिणाम

{"Id":1,"Name":"John","Age":23}

Parse JSON पाठ OPENJSON फ़ंक्शन का उपयोग कर रहा है

OPENJSON फ़ंक्शन JSON टेक्स्ट को पार्स करता है और कई आउटपुट देता है। वे मान जो लौटाए जाने चाहिए, जो कि क्लॉज़ के साथ परिभाषित किए गए रास्तों का उपयोग करके निर्दिष्ट किए गए हैं। यदि किसी स्तंभ के लिए पथ निर्दिष्ट नहीं है, तो स्तंभ नाम का उपयोग पथ के रूप में किया जाता है। इस फ़ंक्शन ने मान को क्लॉज़ के साथ परिभाषित SQL प्रकारों में वापस कर दिया। यदि कोई वस्तु / सरणी वापस की जानी चाहिए, तो JSON विकल्प को कॉलम परिभाषा में निर्दिष्ट किया जाना चाहिए।

DECLARE @json NVARCHAR(100) = '{"id": 1, "user":{"name":"John"}, "skills":["C#","SQL"]}'

SELECT * 
FROM OPENJSON (@json)
    WITH(Id int '$.id',
        Name nvarchar(100) '$.user.name',
        UserObject nvarchar(max) '$.user' AS JSON,
        Skills nvarchar(max) '$.skills' AS JSON,
        Skill0 nvarchar(20) '$.skills[0]')

परिणाम

ईद नाम UserObject कौशल Skill0
1 जॉन { "नाम": "जॉन"} [ "सी #", "एसक्यूएल"] सी#


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow