Bắt đầu với phiên bản SQLite 3.38.0 (phát hành vào ngày 22 tháng 2 năm 2022), bây giờ chúng ta có thể sử dụng ->
và ->>
toán tử để trích xuất các thành phần con của tài liệu JSON.
Mục đích của các toán tử này là tương thích với các toán tử MySQL và PostgreSQL tương đương.
Ngoài ra, bắt đầu với SQLite 3.38.0, các hàm JSON hiện đã được tích hợp sẵn. Do đó, không cần sử dụng -DSQLITE_ENABLE_JSON1
nữa tùy chọn thời gian biên dịch để bật hỗ trợ JSON.
Cú pháp
Cách thức hoạt động của các toán tử này như sau:
json -> path
json ->> path
Ở đâu json
là tài liệu JSON và path
là đường dẫn 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ó.
Sự khác biệt giữa các toán tử này như sau:
-
->
toán tử luôn trả về một biểu diễn JSON của thành phần con được chỉ định -
->>
toán tử luôn trả về một biểu diễn SQL của thành phần con được chỉ định
Ví dụ về ->
Nhà điều hành
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ể làm như thế này:
SELECT '{ "name" : "Wag", "type" : "Dog" }' -> 'type';
Kết quả:
"Dog"
Ví dụ về ->>
Nhà điều hành
Đây là những gì sẽ xảy ra khi chúng tôi sử dụng ->>
thay vào đó:
SELECT '{ "name" : "Wag", "type" : "Dog" }' ->> '$.type';
Kết quả:
Dog
Giá trị không được trích dẫn như trước đây. Đó là bởi vì ->
trả về biểu diễn JSON của thành phần con và ->>
trả về một biểu diễn SQL.
->>
toán tử trả về giá trị SQL TEXT, INTEGER, REAL hoặc NULL đạ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.
Dưới đây là một ví dụ với một mảng:
SELECT '{ "scores" : [ 9, 7, 5 ] }' ->> '$.scores[2]';
Kết quả:
5
Nếu giá trị chỉ bao gồm một mảng, chúng ta có thể thực hiện điều này:
SELECT '[ 9, 7, 5 ]' ->> '2';
Kết quả:
5
Điều đó trả về phần tử mảng ở chỉ mục được chỉ định (trong trường hợp này là 2).
Mảng dựa trên 0 (đếm bắt đầu từ 0
), và đó là lý do tại sao 2
trả lại mặt hàng thứ ba.