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

3 cách trích xuất giá trị từ tài liệu JSON trong SQLite

Khi sử dụng SQLite, chúng ta có thể sử dụng các phương pháp sau để trích xuất dữ liệu từ tài liệu JSON.

json_extract() Chức năng

Như tên gọi của nó, json_extract() hàm trích xuất và trả về một hoặc nhiều giá trị từ JSON được định dạng tốt.

Ví dụ:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[1]'
);

Kết quả:

{"name":"Bark","scores":[3,4,8,7]}

Mảng dựa trên 0 và do đó, số lượng bắt đầu từ 0 . Do đó, chúng tôi đã chỉ định [1] để lấy phần tử thứ hai trong dogs mảng, tình cờ là một đối tượng JSON.

Chúng tôi chỉ có thể trả về tên của con chó tại vị trí đó trong mảng bằng cách thêm vào đường dẫn của chúng tôi:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[1].name'
);

Kết quả:

Bark

Chúng ta có thể sử dụng json_extract() để trả về nhiều đường dẫn:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[0].name',
'$.dogs[1].name',
'$.dogs[2].name'
);

Kết quả:

["Wag","Bark","Woof"]

Khi chúng tôi trích xuất các giá trị từ nhiều đường dẫn, các giá trị được trả về trong một mảng.

-> Nhà điều hành

-> toán tử trích xuất thành phần con từ tài liệu JSON và trả về biểu diễn JSON của thành phần con đó.

Do đó, chúng ta có thể thay đổi ví dụ đầu tiên thành sau:

SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' -> '$.dogs[1]';

Kết quả:

{"name":"Bark","scores":[3,4,8,7]}

-> toán tử khác với json_extract() chức năng:

  • -> toán tử luôn trả về một biểu diễn JSON của thành phần con.
  • json_extract() hàm chỉ trả về JSON nếu có hai hoặc nhiều đối số đường dẫn (vì kết quả sau đó là một mảng JSON) hoặc nếu đối số đường dẫn đơn tham chiếu đến một mảng hoặc đối tượng.
  • Nếu chỉ có một đối số đường dẫn và đường dẫn đó tham chiếu đến JSON null hoặc chuỗi hoặc giá trị số, thì json_extract() trả về giá trị SQL NULL, TEXT, INTEGER hoặc REAL tương ứng.

Do đó, đây là những gì sẽ xảy ra khi chúng tôi trích xuất tên một con chó từ JSON của chúng tôi:

SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' -> '$.dogs[1].name';

Kết quả:

"Bark"

Lần này, nó được bao quanh bởi dấu ngoặc kép. Đó là bởi vì nó trả về một biểu diễn JSON của giá trị. Khi chúng tôi trích xuất cùng một giá trị với json_extract() trước đây, chúng tôi có một biểu diễn SQL của giá trị.

Tuy nhiên, chúng ta cũng có thể sử dụng ->> toán tử để trả về một biểu diễn SQL.

->> Nhà điều hành

->> toán tử hoạt động theo cách giống như -> toán tử, ngoại trừ ->> trả về một biểu diễn SQL của thành phần con được chỉ định. Cụ thể, nó trả về một SQL TEXT , INTEGER , REAL hoặc NULL giá trị đại diện cho thành phần con đã chọn hoặc NULL nếu thành phần con không tồn tại.

Do đó, đây là những gì sẽ xảy ra khi chúng tôi sử dụng ->> toán tử để trích xuất tên của con chó:

SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' ->> '$.dogs[1].name';

Kết quả:

Bark

Nó không còn được đặt trong dấu ngoặc kép.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiển thị tiến trình trong khi doInbackground

  2. Android ListView:làm thế nào để tránh truy vấn cơ sở dữ liệu trong bindView ()? Cần tìm nạp một đến nhiều dữ liệu mối quan hệ

  3. SQLiteException không có bảng như vậy:ItemTable trong khi biên dịch:Select_id, .... từ ItemTable

  4. đặt sqlite db đúng cách trong android

  5. SQLite COUNT