Rumah > Soal Jawab > teks badan
P粉8271215582023-08-28 13:36:44
Memang menyahnormalkan kepada JSON bukanlah idea yang baik, tetapi kadangkala anda perlu berurusan dengan data JSON dan terdapat cara untuk mengekstrak tatasusunan JSON ke dalam baris dalam pertanyaan.
Caranya ialah dengan melakukan gabungan pada jadual indeks sementara atau sebaris, yang memberikan anda baris untuk setiap nilai bukan nol dalam tatasusunan JSON. Iaitu, jika anda mempunyai jadual dengan nilai 0, 1 dan 2 dan anda menyertainya ke tatasusunan JSON "ikan" yang mengandungi dua entri, maka Fish[0] sepadan dengan 0, dengan itu menghasilkan satu baris, dan Fish 1 sepadan dengan 1, menghasilkan baris kedua, tetapi fish[2] adalah batal, jadi ia tidak sepadan dengan 2 dan tiada baris dihasilkan dalam cantuman. Anda memerlukan seberapa banyak nombor dalam jadual indeks sebagai panjang maksimum mana-mana tatasusunan dalam data JSON. Ini adalah sedikit hack, dan menyakitkan seperti contoh OP, tetapi ia sangat mudah.
Contoh (memerlukan MySQL 5.7.8 atau lebih tinggi):
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;
Hasilnya ialah:
+---------+-----+---------+ | rec_num | idx | fishes | +---------+-----+---------+ | 1 | 0 | "red" | | 1 | 1 | "blue" | | 2 | 0 | "one" | | 2 | 1 | "two" | | 2 | 2 | "three" | +---------+-----+---------+
Nampaknya pasukan MySQL mungkin menambah fungsi (MySQL 团队已经添加了JSON_TABLE
dalam MySQL 8 untuk memudahkan perkara ini. (http://mysqlserverteam.com/mysql-8-0-labs -json-aggregation-functions/JSON_TABLE
函数,以使这一切变得更容易。 (http://mysqlserverteam.com/mysql-8-0-labs -json-aggregation-functions/)JSON_TABLE
) (Pasukan MySQL telah menambah JSON_TABLE
fungsi.)
P粉4038048442023-08-28 09:32:06
Berikut ialah cara menggunakan JSON_TABLE dalam MySQL 8+:
SELECT * FROM JSON_TABLE( '[5, 6, 7]', "$[*]" COLUMNS( Value INT PATH "$" ) ) data;
Anda juga boleh menggunakannya sebagai fungsi pemisahan rentetan tujuan umum yang kekurangan MySQL (serupa dengan regexp_split_to_table PG atau STRING_SPLIT MSSQL) dengan mengambil rentetan yang dipisahkan dan menukarnya kepada rentetan JSON:
set @delimited = 'a,b,c'; SELECT * FROM JSON_TABLE( CONCAT('["', REPLACE(@delimited, ',', '", "'), '"]'), "$[*]" COLUMNS( Value varchar(50) PATH "$" ) ) data;