Trong SQLite, ->>
toán tử trích xuất một thành phần con từ tài liệu JSON và trả về một biểu diễn SQL của thành phần con đó.
->>
toán tử lần đầu tiên được giới thiệu trong phiên bản SQLite 3.38.0 (phát hành vào ngày 22 tháng 2 năm 2022).
Cú pháp
Cú pháp như sau:
json ->> path
Ở đâu json
là tài liệu JSON và path
là đường dẫn đến thành phần con mà chúng tôi muốn trích xuất từ nó.
Vì vậy, chúng tôi cung cấp một tài liệu JSON ở bên trái của toán tử và chúng tôi chỉ định đường dẫn chúng tôi muốn trích xuất ở bên phải của nó.
->>
toán tử luôn trả về một biểu diễn SQL của thành phần con được chỉ định. Để trả về biểu diễn JSON, hãy sử dụng ->
thay vào đó là toán tử.
Ví dụ
Dưới đây là một ví dụ đơn giản để chứng minh cách ->>
nhà điều hành hoạt động:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$';
Kết quả:
{"name":"Wag","type":"Dog"}
Trong trường hợp này, tôi đã chỉ định một đường dẫn là '$'
trả về toàn bộ tài liệu.
Hãy chỉ định một đường dẫn khác:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.type';
Kết quả:
Dog
Chúng ta cũng có thể bỏ qua hoàn toàn ký hiệu đô la và dấu dừng hoàn toàn, như sau:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'type';
Kết quả:
Dog
Đây là tài liệu JSON lớn hơn:
SELECT '[
{
"user" : "Spike",
"age" : 30,
"scores" : [ 9, 7, 3 ]
},
{
"user" : "Faye",
"age" : 25,
"scores" : [ 90, 87, 93 ]
},
{
"user" : "Jet",
"age" : 40,
"scores" : [ 50, 38, 67 ]
}
]' ->> '$[0]';
Kết quả:
{"user":"Spike","age":30,"scores":[9,7,3]}
Trong SQLite, mảng dựa trên 0 và do đó chỉ định [0]
trả về phần tử mảng đầu tiên.
Nếu chúng tôi chỉ muốn nhận được điểm số của người dùng đó, chúng tôi có thể làm điều này:
SELECT '[
{
"user" : "Spike",
"age" : 30,
"scores" : [ 9, 7, 3 ]
},
{
"user" : "Faye",
"age" : 25,
"scores" : [ 90, 87, 93 ]
},
{
"user" : "Jet",
"age" : 40,
"scores" : [ 50, 38, 67 ]
}
]' ->> '$[0].scores';
Kết quả:
[9,7,3]
Chúng tôi có thể đi sâu hơn nữa và trích ra một số điểm cụ thể:
SELECT '[
{
"user" : "Spike",
"age" : 30,
"scores" : [ 9, 7, 3 ]
},
{
"user" : "Faye",
"age" : 25,
"scores" : [ 90, 87, 93 ]
},
{
"user" : "Jet",
"age" : 40,
"scores" : [ 50, 38, 67 ]
}
]' ->> '$[0].scores[1]';
Kết quả:
7
Đường dẫn không tồn tại
Nếu đường dẫn không tồn tại trong JSON, giá trị null được trả về:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.age';
Kết quả:
null
Lưu ý rằng Trong SQLite, bạn có thể sử dụng .nullvalue
để chỉ định một chuỗi xuất ra bất cứ khi nào giá trị null được trả về. Trong trường hợp của tôi, trước đó tôi đã chạy lệnh sau:
.nullvalue null
Điều đó chỉ định rằng văn bản null
sẽ được xuất ra bất cứ khi nào giá trị null được trả về. Đó là lý do tại sao ví dụ trên xuất ra văn bản null
. Nếu tôi không làm điều này, kết quả có thể bị trống.
JSON không hợp lệ
Nếu đối số đầu tiên không phải là JSON hợp lệ, thì sẽ xảy ra lỗi:
SELECT '{ "name" }' ->> '$';
Kết quả:
Runtime error: malformed JSON
Đường dẫn không hợp lệ
Và nếu đối số thứ hai không phải là một đường dẫn hợp lệ, thì sẽ xảy ra lỗi:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$name';
Kết quả:
Runtime error: JSON path error near 'name'
Trong trường hợp này, tôi đã quên bao gồm điểm dừng đầy đủ (.
) giữa ký hiệu đô la ($
) và name
.
Tuy nhiên, như đã đề cập, có thể bỏ qua hoàn toàn ký hiệu đô la và dấu dừng hoàn toàn:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> 'name';
Kết quả:
Wag