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