Trong Cơ sở dữ liệu Oracle, JSON_QUERY()
hàm chọn và trả về một hoặc nhiều giá trị từ dữ liệu JSON và trả về các giá trị đó.
Bạn có thể sử dụng hàm để truy xuất các đoạn của tài liệu JSON.
Cú pháp
Cú pháp như sau:
JSON_QUERY
( expr [ FORMAT JSON ], JSON_basic_path_expression
[ JSON_query_returning_clause ] [ JSON_query_wrapper_clause ]
[ JSON_query_on_error_clause ] [ JSON_query_on_empty_clause ]
)
Ở đâu:
-
expr
là tài liệu JSON mà bạn muốn truy vấn -
JSON_basic_path_expression
là đường dẫn SQL / JSON mà bạn muốn trả về từ tài liệu JSON đó. Hàm sử dụng biểu thức đường dẫn để đánh giáexpr
và tìm một hoặc nhiều giá trị JSON phù hợp hoặc thỏa mãn biểu thức đường dẫn. Biểu thức đường dẫn phải là một ký tự văn bản. -
JSON_query_returning_clause
chỉ định kiểu dữ liệu và định dạng của chuỗi ký tự được trả về bởi hàm. -
JSON_query_wrapper_clause
kiểm soát xem hàm có bao bọc các giá trị được trả về trong trình bao bọc mảng hay không (dấu ngoặc vuông ([]
)). -
JSON_query_on_error_clause
chỉ định giá trị được trả về khi một số lỗi nhất định xảy ra. -
JSON_query_on_empty_clause
chỉ định giá trị được trả về nếu không tìm thấy kết quả khớp nào khi dữ liệu JSON được đánh giá bằng cách sử dụng biểu thức đường dẫn SQL / JSON.
Xem tài liệu Oracle để biết giải thích chi tiết về các điều khoản tùy chọn.
Ví dụ
Dưới đây là một ví dụ để minh họa cách JSON_QUERY()
chức năng hoạt động:
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$')
FROM DUAL;
Kết quả:
{"a":1,"b":2,"c":3}
Việc sử dụng chính ký hiệu đô la sẽ trả về toàn bộ chuỗi dữ liệu JSON.
Với Wrapper
Bạn có thể sử dụng WITH WRAPPER
mệnh đề bao bọc kết quả trong một trình bao bọc mảng:
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$' WITH WRAPPER)
FROM DUAL;
Kết quả:
[{"a":1,"b":2,"c":3}]
Bạn phải chỉ định mệnh đề này nếu biểu thức đường dẫn khớp với một giá trị vô hướng đơn (giá trị không phải là đối tượng JSON hoặc mảng JSON) hoặc nhiều giá trị thuộc bất kỳ loại nào.
Ví dụ:việc trả về giá trị vô hướng sau phải được thực hiện với WITH WRAPPER
mệnh đề:
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$.b' WITH WRAPPER)
FROM DUAL;
Kết quả:
[2]
Bỏ qua WITH WRAPPER
mệnh đề khi trả về giá trị vô hướng dẫn đến giá trị null được trả về:
SET NULL 'null';
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$.b')
FROM DUAL;
Kết quả:
null
Theo mặc định, SQLcl và SQL * Plus trả về một khoảng trống bất cứ khi nào null
xảy ra do một SELECT
trong SQL tuyên bố.
Tuy nhiên, bạn có thể sử dụng SET NULL
để chỉ định một chuỗi khác được trả về. Ở đây tôi đã chỉ định rằng chuỗi null
nên được trả lại.
Với Trình gói có Điều kiện
Ngoài ra, bạn có thể sử dụng WITH CONDITIONAL WRAPPER
mệnh đề chỉ bao gồm trình bao bọc mảng nếu biểu thức đường dẫn khớp với một giá trị vô hướng đơn hoặc nhiều giá trị thuộc bất kỳ kiểu nào. Nếu biểu thức đường dẫn khớp với một đối tượng JSON hoặc mảng JSON, thì trình bao bọc mảng sẽ bị bỏ qua:
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$' WITH CONDITIONAL WRAPPER) AS "r1",
JSON_QUERY('{a:1, b:2, c:3}', '$.b' WITH CONDITIONAL WRAPPER) AS "r2"
FROM DUAL;
Kết quả:
r1 r2 ______________________ ______ {"a":1,"b":2,"c":3} [2]
Trong trường hợp này, chỉ giá trị vô hướng mới được áp dụng trình bao bọc mảng.
Chỉ cần nói rõ, đây là với một trình bao bọc vô điều kiện:
SELECT
JSON_QUERY('{a:1, b:2, c:3}', '$' WITH UNCONDITIONAL WRAPPER) AS "r1",
JSON_QUERY('{a:1, b:2, c:3}', '$.b' WITH UNCONDITIONAL WRAPPER) AS "r2"
FROM DUAL;
Kết quả:
r1 r2 ________________________ ______ [{"a":1,"b":2,"c":3}] [2]
Lần này cả hai kết quả đều được áp dụng trình bao bọc.
Lưu ý rằng WITH UNCONDITIONAL WRAPPER
tương đương với WITH WRAPPER
.
Xử lý lỗi
Có năm mệnh đề mà bạn có thể sử dụng để chỉ định nội dung sẽ trả về bất cứ khi nào xảy ra một số loại lỗi nhất định. Các mệnh đề là:
-
NULL
ON
ERROR
- Trả về null khi xảy ra lỗi. Đây là mặc định. -
ERROR
ON
ERROR
- Trả về lỗi Oracle thích hợp khi xảy ra lỗi. -
EMPTY
ON
ERROR
- Việc chỉ định điều khoản này tương đương với việc chỉ địnhEMPTY
ARRAY
ON
ERROR
. -
EMPTY
ARRAY
ON
ERROR
- Trả về một mảng JSON trống ([]
) khi xảy ra lỗi. -
EMPTY
OBJECT
ON
ERROR
- Trả về một đối tượng JSON trống ({}
) khi xảy ra lỗi.
Đây là một ví dụ:
SELECT
JSON_QUERY('["a", "b", "c"]', '$[3]' NULL ON ERROR) AS "r1",
JSON_QUERY('["a", "b", "c"]', '$[3]' EMPTY ON ERROR) AS "r2",
JSON_QUERY('["a", "b", "c"]', '$[3]' EMPTY OBJECT ON ERROR) AS "r3"
FROM DUAL;
Kết quả:
r1 r2 r3 _______ _____ _____ null [] {}
Đây là với ERROR ON ERROR
mệnh đề:
SELECT
JSON_QUERY('["a", "b", "c"]', '$[3]' ERROR ON ERROR)
FROM DUAL;
Kết quả:
Error report - ORA-40462: JSON_VALUE evaluated to no value
Các điều khoản lỗi này dùng để xử lý các lỗi sau:
- Đối số đầu tiên không phải là dữ liệu JSON được định dạng tốt bằng cách sử dụng cú pháp JSON chặt chẽ hoặc lỏng lẻo
- Không tìm thấy kết quả phù hợp nào khi dữ liệu JSON được đánh giá bằng cách sử dụng biểu thức đường dẫn SQL / JSON. Bạn có thể ghi đè hành vi cho loại lỗi này bằng cách chỉ định
JSON_query_on_empty_clause
. - Kiểu dữ liệu giá trị trả về không đủ lớn để chứa chuỗi ký tự trả về
- Hàm đối sánh với một giá trị vô hướng duy nhất hoặc nhiều giá trị thuộc bất kỳ loại nào và một mệnh đề trình bao bọc không được chỉ định
Xử lý kết quả trống
Bạn cũng có thể sử dụng một mệnh đề để chỉ định giá trị được trả về nếu không tìm thấy kết quả phù hợp nào. Điều khoản này cho phép bạn chỉ định một kết quả khác cho loại lỗi này với kết quả được chỉ định với các điều khoản lỗi.
Các mệnh đề này là:
-
NULL
ON
EMPTY
- Trả về giá trị rỗng khi không tìm thấy kết quả phù hợp nào. -
ERROR
ON
EMPTY
- Trả về lỗi Oracle thích hợp khi không tìm thấy kết quả phù hợp nào. -
EMPTY
ON
EMPTY
- Việc chỉ định điều khoản này tương đương với việc chỉ địnhEMPTY
ARRAY
ON
EMPTY
. -
EMPTY
ARRAY
ON
EMPTY
- Trả về một mảng JSON trống ([]
) khi không tìm thấy kết quả phù hợp nào. -
EMPTY
OBJECT
ON
EMPTY
- Trả về một đối tượng JSON trống ({}
) khi không tìm thấy kết quả phù hợp nào.
Ví dụ:
SELECT
JSON_QUERY('["a", "b", "c"]', '$[3]' EMPTY ON EMPTY)
FROM DUAL;
Kết quả:
[]
Nếu bạn bỏ qua mệnh đề này, thì mệnh đề lỗi sẽ xác định giá trị được trả về khi không tìm thấy kết quả phù hợp nào.