Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL tìm kiếm giá trị json theo khóa trong mảng

Về cơ bản, ý bạn là áp dụng lựa chọn và chiếu vào các phần tử mảng và trường đối tượng của tài liệu JSON của bạn. Bạn cần thực hiện điều gì đó như mệnh đề WHERE để chọn một "hàng" trong mảng, sau đó thực hiện thao tác như chọn một trong các trường (không phải trường bạn đã sử dụng trong tiêu chí lựa chọn của mình).

Chúng được thực hiện trong SQL bằng cách sử dụng mệnh đề WHERE và danh sách cột SELECT, nhưng làm tương tự với JSON không phải là điều bạn có thể làm dễ dàng với các hàm như JSON_SEARCH () và JSON_CONTAINS ().

Giải pháp mà MySQL 8.0 cung cấp là JSON_TABLE () chức năng biến một tài liệu JSON thành một bảng dẫn xuất ảo - như thể bạn đã xác định các hàng và cột thông thường. Nó hoạt động nếu JSON ở định dạng bạn mô tả, một mảng đối tượng.

Đây là bản trình diễn tôi đã thực hiện bằng cách chèn dữ liệu mẫu của bạn vào một bảng:

create table mytable ( mycol json );

insert into mytable set mycol = '[{"Race": "Orc", "strength": 14}, {"Race": "Knight", "strength": 7}]';

SELECT j.* FROM mytable, JSON_TABLE(mycol, 
  '$[*]' COLUMNS (
    race VARCHAR(10) PATH '$.Race', 
    strength INT PATH '$.strength'
  )
) AS j;
+--------+----------+
| race   | strength |
+--------+----------+
| Orc    |       14 |
| Knight |        7 |
+--------+----------+

Giờ đây, bạn có thể làm những việc bạn thường làm với các truy vấn CHỌN, như lựa chọn và chiếu:

SELECT j.strength FROM mytable, JSON_TABLE(mycol, '$[*]' 
  COLUMNS (
    race VARCHAR(10) PATH '$.Race', 
    strength INT PATH '$.strength'
  )
) AS j 
WHERE j.race = 'Orc'
+----------+
| strength |
+----------+
|       14 |
+----------+

Điều này có một số vấn đề:

  1. Bạn cần làm điều này mọi lúc bạn truy vấn dữ liệu JSON hoặc nếu không, hãy tạo CHẾ ĐỘ XEM để thực hiện điều đó.

  2. Bạn đã nói rằng bạn không biết các trường thuộc tính, nhưng để viết truy vấn JSON_TABLE (), bạn phải chỉ định các thuộc tính bạn muốn tìm kiếm và chiếu trong truy vấn của mình. Bạn không thể sử dụng điều này cho dữ liệu hoàn toàn không xác định.

Tôi đã trả lời khá nhiều câu hỏi tương tự về việc sử dụng JSON trong MySQL. Tôi đã quan sát thấy rằng khi bạn muốn làm điều này, xử lý một tài liệu JSON như một bảng để bạn có thể áp dụng điều kiện trong mệnh đề WHERE cho các trường bên trong dữ liệu JSON của bạn, khi đó tất cả các truy vấn của bạn sẽ khó hơn rất nhiều. Sau đó, bạn bắt đầu cảm thấy tốt hơn là nên dành vài phút để xác định các thuộc tính của mình để bạn có thể viết các truy vấn đơn giản hơn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi Mysql:Người dùng được chỉ định làm trình xác định ('mysql.infoschema'@'localhost') không tồn tại 'khi cố gắng kết xuất không gian bảng

  2. Tạo một ứng dụng Ruby on Rails mới bằng MySQL thay vì SQLite

  3. Chèn hàng loạt Hibernate hoạt động như thế nào?

  4. Chọn ngày từ db của tôi mà không cần giây bằng PHP MySql

  5. MySQL:Tìm các hàng không tham gia vào mối quan hệ