Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में JSON_QUERY () बनाम JSON_VALUE ():क्या अंतर है?

SQL सर्वर में उपलब्ध कई T-SQL फ़ंक्शंस में से दो हैं JSON_QUERY() और JSON_VALUE() . इन कार्यों का उपयोग JSON दस्तावेज़ों से डेटा निकालने के लिए किया जा सकता है।

उनका सामान्य सिंटैक्स समान है, और पहली नज़र में, आप सोच सकते हैं कि वे बिल्कुल वही काम करते हैं, लेकिन वे ऐसा नहीं करते हैं। JSON और SQL सर्वर के साथ काम करते समय दोनों कार्यों के लिए निश्चित रूप से एक जगह है।

यह लेख JSON_QUERY() . के बीच के अंतर को देखता है और JSON_VALUE()

अंतर

इन दो कार्यों की परिभाषा थोड़ी अलग है, थोड़ा अलग वाक्यविन्यास है, और उनके वापसी मूल्य थोड़े अलग हैं।

परिभाषाएं

यहां बताया गया है कि दो कार्यों को कैसे परिभाषित किया जाता है:

JSON_QUERY()
JSON स्ट्रिंग से किसी ऑब्जेक्ट या सरणी को एक्सट्रेक्ट करता है।
JSON_VALUE()
JSON स्ट्रिंग से एक अदिश मान निकालता है।

तो इन दो कार्यों के बीच का अंतर वही है जो वे निकालते हैं। एक ऑब्जेक्ट या ऐरे को एक्सट्रेक्ट करता है, दूसरा स्केलर वैल्यू को एक्सट्रैक्ट करता है।

सिंटैक्स अंतर

एक और अंतर वाक्य रचना में है:

JSON_QUERY ( expression [ , path ] )
JSON_VALUE ( expression , path )

JSON_QUERY() देखें वाक्य - विन्यास। path . के चारों ओर वे वर्गाकार कोष्ठक तर्क का अर्थ है कि यह एक वैकल्पिक तर्क है। ऐसा इसलिए है क्योंकि यदि आवश्यक हो तो यह फ़ंक्शन एक संपूर्ण JSON दस्तावेज़ लौटा सकता है।

हालांकि, JSON_VALUE() . का उपयोग करते समय पथ तर्क एक आवश्यक तर्क है समारोह। इसलिए इस फ़ंक्शन का उपयोग करते समय आपको दोनों तर्क प्रदान करने होंगे।

वापसी मूल्य

और एक और अंतर उनके रिटर्न वैल्यू में है।

  • JSON_QUERY() nvarchar(max) . प्रकार का JSON फ़्रैगमेंट लौटाता है
  • JSON_VALUE() nvarchar(4000) . प्रकार का एक टेक्स्ट मान देता है

उदाहरण 1 - एक अदिश मान निकालें

स्केलर मान निकालने का प्रयास करते समय इन कार्यों के बीच अंतर प्रदर्शित करने के लिए यहां एक उदाहरण दिया गया है।

SELECT 
  JSON_VALUE('{"Name": "Homer"}', '$.Name') AS 'JSON_VALUE',
  JSON_QUERY('{"Name": "Homer"}', '$.Name') AS 'JSON_QUERY';

परिणाम:

+--------------+--------------+
| JSON_VALUE   | JSON_QUERY   |
|--------------+--------------|
| Homer        | NULL         |
+--------------+--------------+

तो दोनों फ़ंक्शन JSON दस्तावेज़ से समान मान निकालने का प्रयास कर रहे हैं, लेकिन केवल एक ही सफल होता है:JSON_VALUE() . ऐसा इसलिए है क्योंकि वे जिस मूल्य को निकालने का प्रयास कर रहे हैं वह एक अदिश मान है। मूल रूप से, एक स्केलर मान डेटा की एक इकाई है। यह पाठ या संख्या की एक स्ट्रिंग हो सकती है। लेकिन यह कोई ऑब्जेक्ट या ऐरे नहीं हो सकता।

उदाहरण 2 - एक सरणी निकालें

इस उदाहरण में, दोनों फ़ंक्शन एक संपूर्ण सरणी निकालने का प्रयास करते हैं।

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_VALUE(@data,'$.Suspect.Hobbies') AS 'JSON_VALUE',
   JSON_QUERY(@data,'$.Suspect.Hobbies') AS 'JSON_QUERY';

परिणाम:

+--------------+----------------------------------------+
| JSON_VALUE   | JSON_QUERY                             |
|--------------+----------------------------------------|
| NULL         | ["Eating", "Sleeping", "Base Jumping"] |
+--------------+----------------------------------------+

इस मामले में, केवल JSON_QUERY() समारोह सफल हुआ।

उदाहरण 3 - एक ऐरे आइटम निकालें

यह उदाहरण पिछले एक के समान है, सिवाय इसके कि पूरे सरणी को निकालने की कोशिश करने के बजाय, हम सरणी से केवल एक ही आइटम चाहते हैं।

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_VALUE(@data,'$.Suspect.Hobbies[2]') AS 'JSON_VALUE',
   JSON_QUERY(@data,'$.Suspect.Hobbies[2]') AS 'JSON_QUERY';

परिणाम:

+--------------+--------------+
| JSON_VALUE   | JSON_QUERY   |
|--------------+--------------|
| Base Jumping | NULL         |
+--------------+--------------+

तो इस बार JSON_VALUE() विजेता है।

उदाहरण 4 - एक वस्तु निकालें

आइए पूरी वस्तु के लिए प्रयास करें।

DECLARE @data NVARCHAR(4000)
SET @data=N'{  
    "Suspect": {    
       "Name": "Homer Simpson",
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }
 }'
 SELECT 
   JSON_VALUE(@data,'$.Suspect') AS 'JSON_VALUE',
   JSON_QUERY(@data,'$.Suspect') AS 'JSON_QUERY';

परिणाम:

+--------------+--------------+
| JSON_VALUE   | JSON_QUERY   |
|--------------+--------------|
| NULL         | {    
       "Name": "Homer Simpson",
       "Hobbies": ["Eating", "Sleeping", "Base Jumping"]  
    }              |
+--------------+--------------+

और JSON_QUERY() जीतता है।

(स्वरूपण को क्षमा करें, इस प्रकार मेरा MSSQL कमांड लाइन टूल परिणाम देता है)।

उदाहरण 5 - संपूर्ण JSON दस्तावेज़ निकालें

आइए पूरे JSON दस्तावेज़ के लिए प्रयास करें।

DECLARE @data NVARCHAR(4000)
SET @data=N'{
    "Cities": [
        {
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        },
        {
            "Name": "Qandahar",
            "CountryCode": "AFG",
            "District": "Qandahar",
            "Population": 237500
        }
    ]
}'
SELECT 
  JSON_VALUE(@data, '$') AS 'JSON_VALUE', 
  JSON_QUERY(@data, '$') AS 'JSON_QUERY';

परिणाम:

+--------------+--------------+
| JSON_VALUE   | JSON_QUERY   |
|--------------+--------------|
| NULL         | {
    "Cities": [
        {
            "Name": "Kabul",
            "CountryCode": "AFG",
            "District": "Kabol",
            "Population": 1780000
        },
        {
            "Name": "Qandahar",
            "CountryCode": "AFG",
            "District": "Qandahar",
            "Population": 237500
        }
    ]
}              |
+--------------+--------------+

तो JSON_QUERY() केवल वही है जो पूरे दस्तावेज़ को लौटा सकता है।

उदाहरण 6 - पथ छोड़ दें

इन दो कार्यों के बीच एक और अंतर यह है कि JSON_QUERY() का उपयोग करते समय पथ तर्क वैकल्पिक होता है . यदि आप इसे छोड़ देते हैं, तो संपूर्ण JSON दस्तावेज़ वापस आ जाता है।

JSON_VALUE() . का उपयोग करते समय आप इस तर्क को नहीं छोड़ सकते , क्योंकि यह एक आवश्यक तर्क है। यह शायद इस तथ्य के कारण है कि फ़ंक्शन केवल एक अदिश मान लौटा सकता है। यदि पहले तर्क में केवल एक अदिश मान शामिल है, तो यह मान्य JSON नहीं होगा।

वैसे भी, यहां JSON_QUERY() से पथ तर्क को छोड़ने का एक उदाहरण दिया गया है :

SELECT JSON_QUERY('{"Name": "Homer"}') AS 'Result';

परिणाम:

+-------------------+
| Result            |
|-------------------|
| {"Name": "Homer"} |
+-------------------+

और अगर हम JSON_VALUE() . के साथ उस ट्रिक को आजमाते हैं तो यहां क्या होता है :

SELECT JSON_VALUE('{"Name": "Homer"}') AS 'Result';

परिणाम:

Msg 174, Level 15, State 1, Line 1
The json_value function requires 2 argument(s).

उदाहरण 7 - पथ मोड

पहले के उदाहरणों में, जब कोई फ़ंक्शन आपूर्ति किए गए पथ को संभाल नहीं सकता था, तो यह NULL returned लौटाता था . ऐसा इसलिए है क्योंकि उन सभी उदाहरणों को लैक्स मोड (डिफ़ॉल्ट मोड) में चलाया गया था।

यदि हम उन्हें सख्त मोड में चलाते हैं, तो हमें इसके बजाय एक त्रुटि प्राप्त होगी। पथ मोड को स्पष्ट रूप से निर्दिष्ट करने के लिए, बस इसे डॉलर चिह्न से पहले जोड़ें (और उनके बीच एक स्थान छोड़ दें)।

जब आप सख्त मोड में अमान्य पथ प्रदान करते हैं तो क्या होता है इसका एक उदाहरण यहां दिया गया है:

SELECT 
  JSON_VALUE('{"Name": "Homer"}', 'strict $.Name') AS 'JSON_VALUE',
  JSON_QUERY('{"Name": "Homer"}', 'strict $.Name') AS 'JSON_QUERY';

परिणाम:

Msg 13624, Level 16, State 2, Line 1
Object or array cannot be found in the specified JSON path.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में डेटाटाइम का समय भाग निकालने का सर्वोत्तम तरीका

  2. इंट से कास्ट/कन्वर्ट क्यों एक तारक देता है

  3. SQL केस संवेदनशील स्ट्रिंग तुलना करें

  4. SQL सर्वर त्रुटि 213:स्तंभ नाम या आपूर्ति किए गए मानों की संख्या तालिका परिभाषा से मेल नहीं खाती।

  5. SQL सर्वर एजेंट जॉब (T-SQL) के जॉब स्टेप्स प्राप्त करने के 3 तरीके