Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Ubah array JSON di MySQL menjadi baris

Memang benar bahwa mendenormalisasi ke JSON bukanlah ide yang baik, tetapi terkadang Anda perlu menangani data JSON, dan ada cara untuk mengekstrak larik JSON ke dalam baris dalam kueri.

Triknya adalah melakukan gabungan pada tabel indeks sementara atau sebaris, yang memberi Anda baris untuk setiap nilai bukan nol dalam larik JSON. Yaitu, jika Anda memiliki tabel dengan nilai 0, 1, dan 2 yang Anda gabungkan ke larik JSON “fish” dengan dua entri, maka fish[0] cocok dengan 0, menghasilkan satu baris, dan fish1 cocok dengan 1, menghasilkan baris kedua, tetapi fish[2] adalah nol sehingga tidak cocok dengan 2 dan tidak menghasilkan baris dalam gabungan. Anda memerlukan angka dalam tabel indeks sebanyak panjang maksimum larik apa pun dalam data JSON Anda. Ini sedikit peretasan, dan sama menyakitkannya dengan contoh OP, tetapi ini sangat berguna.

Contoh (memerlukan MySQL 5.7.8 atau yang lebih baru):

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 adalah:

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

Sepertinya tim MySQL dapat menambahkan JSON_TABLE fungsi di MySQL 8 untuk membuat semua ini lebih mudah. (http://mysqlserverteam.com/mysql-8-0 -labs-json-aggregation-functions/ ) (Tim MySQL memiliki menambahkan JSON_TABLE fungsi.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Algoritma yang mencari item terkait berdasarkan tag umum

  2. Bagaimana kita bisa mengirim data di MySQL ketika formulir telah disetel ke enctype=multipart/form-data di node.js?

  3. SQL - Temukan kata lengkap dalam teks

  4. Mysql :membuang database bersama data

  5. ekstensi java.sql.Connection untuk SSH