Trong SQLite, 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.
Chúng tôi truyền JSON làm đối số khi chúng tôi gọi hàm và nó trả về giá trị / s có thể áp dụng.
Chúng tôi có thể chỉ định một hoặc nhiều đường dẫn để trích xuất từ tài liệu JSON.
Cú pháp
Cú pháp như sau:
json_extract(X,P1,P2,...)
Ở đâu X
đại diện cho tài liệu JSON và P1,P2,...
là các đường dẫn mà chúng tôi có thể sử dụng để trích xuất các phần cụ thể của tài liệu JSON.
Ví dụ
Dưới đây là một ví dụ cơ bản để chứng minh:
SELECT json_extract('{ "a" : 1 }', '$');
Kết quả:
{"a":1}
Ở đây, tôi đã chỉ định một đường dẫn là $
, trả về toàn bộ tài liệu JSON.
Dưới đây là một ví dụ với tài liệu JSON lớn hơn:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$'
);
Kết quả:
{"dogs":[{"name":"Wag","scores":[7,9]},{"name":"Bark","scores":[3,4,8,7]},{"name":"Woof","scores":[3,2,1]}]}
Hãy thay đổi đường dẫn để chúng tôi chỉ trả về dogs
mảng:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs'
);
Kết quả:
[{"name":"Wag","scores":[7,9]},{"name":"Bark","scores":[3,4,8,7]},{"name":"Woof","scores":[3,2,1]}]
Hãy chọn một trong các phần tử trong mảng:
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.
Hãy đi sâu hơn một lần nữa và chỉ trả lại tên của con chó ở vị trí đó trong mảng:
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ỉ định nhiều đường dẫn
json_extract()
chức năng cho phép chúng tôi chọn 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"]
Trong trường hợp này, tôi đã trả lại tên của tất cả các con chó trong dogs
mảng.
Tất cả các tên chó được trả về trong một mảng.
Chọn một đường dẫn không tồn tại
Nếu chúng tôi trỏ đến một đường dẫn không tồn tại, null
được trả lại.
Đầu tiên, hãy đặt .nullvalue
thành NULL
:
.nullvalue NULL
.nullvalue
lệnh dot cho phép chúng tôi cung cấp một chuỗi sẽ được sử dụng để thay thế các giá trị null. Đó là một trong số cách bạn có thể thay thế các giá trị null bằng một chuỗi trong SQLite. Trong trường hợp này, tôi đặt nó thành NULL
. Bây giờ, mọi giá trị null sẽ trả về NULL
thay vì một kết quả trống.
Bây giờ chúng ta hãy gọi json_extract()
, nhưng sử dụng đối số thứ hai trỏ đến một đường dẫn không tồn tại:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.cats'
);
Kết quả:
NULL
Đường dẫn không hợp lệ
Chúng tôi sẽ gặp lỗi nếu đường dẫn của chúng tôi không đúng:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'dogs'
);
Kết quả:
Runtime error: JSON path error near 'dogs'
Trong trường hợp này, tôi đã quên bao gồm $.
ở phía trước của con đường.
Tài liệu JSON không hợp lệ
Chúng tôi cũng sẽ gặp lỗi do JSON không được định dạng tốt:
SELECT json_extract('{ "Dogs" : }',
'$'
);
Kết quả:
Runtime error: malformed JSON
Lần này, lỗi cho chúng tôi biết rằng JSON của chúng tôi không đúng định dạng.
Các loại trả lại
Tài liệu SQLite nêu rõ những điều sau:
Nếu chỉ cung cấp một đường dẫn duy nhất P1, thì kiểu dữ liệu SQL của kết quả là NULL cho JSON null, INTEGER hoặc REAL cho một giá trị số JSON, một INTEGER 0 cho một giá trị sai JSON, một INTEGER cho một giá trị JSON true, văn bản được trích dẫn cho giá trị chuỗi JSON và biểu diễn văn bản cho các giá trị mảng và đối tượng JSON. Nếu có nhiều đối số đường dẫn (P1, P2, v.v.) thì quy trình này trả về văn bản SQLite là một mảng JSON được định dạng tốt chứa các giá trị khác nhau.
Khả năng tương thích MySQL
Tài liệu SQLite cũng cảnh báo chúng ta về sự không tương thích nhỏ giữa triển khai SQLite và MySQL của json_extract()
chức năng.
Cụ thể, nó nêu rõ:
Phiên bản MySQL của json_extract () luôn trả về JSON. Phiên bản SQLite của json_extract () chỉ trả về JSON nếu có hai hoặc nhiều đối số PATH (vì kết quả sau đó là một mảng JSON) hoặc nếu đối số PATH duy nhất tham chiếu đến một mảng hoặc đối tượng. Trong SQLite, nếu json_extract () chỉ có một đối số PATH duy nhất và PATH 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.
Về cơ bản, sự khác biệt này chỉ trở nên rõ ràng khi truy cập các giá trị riêng lẻ trong JSON là chuỗi hoặc NULL.