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

MySQL में JSON सरणी को पंक्तियों में बदलें

यह सच है कि JSON में डीनॉर्मलाइज़ करना एक अच्छा विचार नहीं है, लेकिन कभी-कभी आपको JSON डेटा से निपटने की आवश्यकता होती है, और एक क्वेरी में JSON सरणी को पंक्तियों में निकालने का एक तरीका है।

चाल इंडेक्स की एक अस्थायी या इनलाइन तालिका में शामिल होने के लिए है, जो आपको JSON सरणी में प्रत्येक गैर-शून्य मान के लिए एक पंक्ति देता है। यानी, यदि आपके पास 0, 1 और 2 मान वाली एक तालिका है जिसे आप JSON सरणी "fish" में दो प्रविष्टियों के साथ जोड़ते हैं, तो fish[0] 0 से मेल खाता है, जिसके परिणामस्वरूप एक पंक्ति होती है, और fish1 1 से मेल खाता है, जिसके परिणामस्वरूप दूसरी पंक्ति होती है, लेकिन मछली [2] शून्य है इसलिए यह 2 से मेल नहीं खाता है और शामिल होने में एक पंक्ति नहीं बनाता है। आपको अपने JSON डेटा में किसी भी सरणी की अधिकतम लंबाई के रूप में अनुक्रमणिका तालिका में कई संख्याओं की आवश्यकता है। यह थोड़ा सा हैक है, और यह ओपी के उदाहरण जितना ही दर्दनाक है, लेकिन यह बहुत आसान है।

उदाहरण (MySQL 5.7.8 या बाद के संस्करण की आवश्यकता है):

CREATE TABLE t1 (rec_num INT, jdoc JSON);
INSERT INTO t1 VALUES 
  (1, '{"fish": ["red", "blue"]}'), 
  (2, '{"fish": ["one", "two", "three"]}');

SELECT
  rec_num,
  idx,
  JSON_EXTRACT(jdoc, CONCAT('$.fish[', idx, ']')) AS fishes
FROM t1
  -- Inline table of sequential values to index into JSON array
JOIN ( 
  SELECT  0 AS idx UNION
  SELECT  1 AS idx UNION
  SELECT  2 AS idx UNION
  -- ... continue as needed to max length of JSON array
  SELECT  3
  ) AS indexes
WHERE JSON_EXTRACT(jdoc, CONCAT('$.fish[', idx, ']')) IS NOT NULL
ORDER BY rec_num, idx;

नतीजा यह है:

+---------+-----+---------+
| rec_num | idx | fishes  |
+---------+-----+---------+
|       1 |   0 | "red"   |
|       1 |   1 | "blue"  |
|       2 |   0 | "one"   |
|       2 |   1 | "two"   |
|       2 |   2 | "three" |
+---------+-----+---------+

ऐसा लगता है कि MySQL टीम JSON_TABLE जोड़ सकती है यह सब आसान बनाने के लिए MySQL 8 में कार्य करें। (http://mysqlserverteam.com/mysql-8-0 -लैब्स-जेसन-एग्रीगेशन-फ़ंक्शंस/ ) (MySQL टीम के पास है एक JSON_TABLE जोड़ा समारोह।)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक पंक्ति सम्मिलित करने के लिए SqlDataAdapter का उपयोग करना

  2. त्रुटि 1148:इस MySQL संस्करण के साथ प्रयुक्त कमांड की अनुमति नहीं है

  3. क्या कनेक्शन स्थापित करने के लिए c# में .mylogin.cnf फ़ाइल का उपयोग करना संभव है?

  4. MySQL:TIMESTAMP के लिए अमान्य डिफ़ॉल्ट मान

  5. जावा प्रोग्राम से MySQL में डेटा स्टोर करने का सबसे आसान तरीका क्या है?