Unicode thoát lỗi python

Các loại dữ liệu JSON dùng để lưu trữ dữ liệu JSON (Ký hiệu đối tượng JavaScript), như được chỉ định trong RFC 7159. Dữ liệu như vậy cũng có thể được lưu trữ dưới dạng

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
5, nhưng các loại dữ liệu JSON có lợi thế là bắt buộc mỗi giá trị được lưu trữ phải hợp lệ theo các quy tắc JSON. Ngoài ra còn có các loại hàm và toán tử dành riêng cho JSON có sẵn cho dữ liệu được lưu trữ trong các loại dữ liệu này; . 16

PostgreSQL cung cấp hai loại để lưu trữ dữ liệu JSON.

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
6 và
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7. Để triển khai các cơ chế truy vấn hiệu quả cho các kiểu dữ liệu này, PostgreSQL cũng cung cấp kiểu dữ liệu
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
8 được mô tả trong

Các kiểu dữ liệu

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
6 và
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 chấp nhận các bộ giá trị gần như giống hệt nhau làm đầu vào. Sự khác biệt thực tế chính là một trong những hiệu quả. Kiểu dữ liệu
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
6 lưu trữ một bản sao chính xác của văn bản đầu vào, mà các chức năng xử lý phải phân tích lại trên mỗi lần thực hiện; .
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 cũng hỗ trợ lập chỉ mục, đây có thể là một lợi thế đáng kể

Bởi vì loại

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
6 lưu trữ một bản sao chính xác của văn bản đầu vào, nên nó sẽ duy trì khoảng trắng không đáng kể về mặt ngữ nghĩa giữa các mã thông báo, cũng như thứ tự các khóa trong các đối tượng JSON. Ngoài ra, nếu một đối tượng JSON trong giá trị chứa cùng một khóa nhiều lần, thì tất cả các cặp khóa/giá trị đều được giữ lại. (Các chức năng xử lý coi giá trị cuối cùng là giá trị hoạt động. ) Ngược lại,
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 không bảo toàn khoảng trắng, không bảo toàn thứ tự của các khóa đối tượng và không giữ các khóa đối tượng trùng lặp. Nếu các khóa trùng lặp được chỉ định trong đầu vào, chỉ giá trị cuối cùng được giữ lại

Nói chung, hầu hết các ứng dụng nên lưu trữ dữ liệu JSON dưới dạng

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7, trừ khi có những nhu cầu khá đặc biệt, chẳng hạn như các giả định kế thừa về thứ tự của các khóa đối tượng

RFC 7159 chỉ định rằng các chuỗi JSON phải được mã hóa bằng UTF8. Do đó, các loại JSON không thể tuân thủ chặt chẽ với đặc tả JSON trừ khi mã hóa cơ sở dữ liệu là UTF8. Nỗ lực bao gồm trực tiếp các ký tự không thể được biểu diễn trong mã hóa cơ sở dữ liệu sẽ không thành công;

RFC 7159 cho phép các chuỗi JSON chứa các chuỗi thoát Unicode được biểu thị bằng

-- Simple scalar/primitive values contain only the identical value:
SELECT '"foo"'::jsonb @> '"foo"'::jsonb;

-- The array on the right side is contained within the one on the left:
SELECT '[1, 2, 3]'::jsonb @> '[1, 3]'::jsonb;

-- Order of array elements is not significant, so this is also true:
SELECT '[1, 2, 3]'::jsonb @> '[3, 1]'::jsonb;

-- Duplicate array elements don't matter either:
SELECT '[1, 2, 3]'::jsonb @> '[1, 2, 2]'::jsonb;

-- The object with a single pair on the right side is contained
-- within the object on the left side:
SELECT '{"product": "PostgreSQL", "version": 9.4, "jsonb": true}'::jsonb @> '{"version": 9.4}'::jsonb;

-- The array on the right side is not considered contained within the
-- array on the left, even though a similar array is nested within it:
SELECT '[1, 2, [1, 3]]'::jsonb @> '[1, 3]'::jsonb;  -- yields false

-- But with a layer of nesting, it is contained:
SELECT '[1, 2, [1, 3]]'::jsonb @> '[[1, 3]]'::jsonb;

-- Similarly, containment is not reported here:
SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"bar": "baz"}'::jsonb;  -- yields false

-- A top-level key and an empty object is contained:
SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"foo": {}}'::jsonb;
7. Trong hàm nhập liệu cho loại
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
6, các ký tự thoát Unicode được cho phép bất kể mã hóa cơ sở dữ liệu và chỉ được kiểm tra tính chính xác của cú pháp (nghĩa là bốn chữ số hex theo sau
-- Simple scalar/primitive values contain only the identical value:
SELECT '"foo"'::jsonb @> '"foo"'::jsonb;

-- The array on the right side is contained within the one on the left:
SELECT '[1, 2, 3]'::jsonb @> '[1, 3]'::jsonb;

-- Order of array elements is not significant, so this is also true:
SELECT '[1, 2, 3]'::jsonb @> '[3, 1]'::jsonb;

-- Duplicate array elements don't matter either:
SELECT '[1, 2, 3]'::jsonb @> '[1, 2, 2]'::jsonb;

-- The object with a single pair on the right side is contained
-- within the object on the left side:
SELECT '{"product": "PostgreSQL", "version": 9.4, "jsonb": true}'::jsonb @> '{"version": 9.4}'::jsonb;

-- The array on the right side is not considered contained within the
-- array on the left, even though a similar array is nested within it:
SELECT '[1, 2, [1, 3]]'::jsonb @> '[1, 3]'::jsonb;  -- yields false

-- But with a layer of nesting, it is contained:
SELECT '[1, 2, [1, 3]]'::jsonb @> '[[1, 3]]'::jsonb;

-- Similarly, containment is not reported here:
SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"bar": "baz"}'::jsonb;  -- yields false

-- A top-level key and an empty object is contained:
SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"foo": {}}'::jsonb;
9). Tuy nhiên, chức năng nhập liệu cho
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 chặt chẽ hơn. nó không cho phép thoát Unicode đối với các ký tự không thể biểu diễn trong mã hóa cơ sở dữ liệu. Loại
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 cũng từ chối
-- This array contains the primitive string value:
SELECT '["foo", "bar"]'::jsonb @> '"bar"'::jsonb;

-- This exception is not reciprocal -- non-containment is reported here:
SELECT '"bar"'::jsonb @> '["bar"]'::jsonb;  -- yields false
2 (vì loại đó không thể được biểu diễn trong loại
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
5 của PostgreSQL) và nó khẳng định rằng mọi việc sử dụng các cặp thay thế Unicode để chỉ định các ký tự bên ngoài Mặt phẳng đa ngôn ngữ cơ bản Unicode đều đúng. Các ký tự thoát Unicode hợp lệ được chuyển đổi thành ký tự đơn tương đương để lưu trữ;

Ghi chú

Nhiều hàm xử lý JSON được mô tả trong Phần 9. 16 sẽ chuyển đổi các dấu thoát Unicode thành các ký tự thông thường và do đó sẽ đưa ra các loại lỗi giống như vừa mô tả ngay cả khi đầu vào của chúng thuộc loại

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
6 chứ không phải
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7. Thực tế là hàm đầu vào
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
6 không thực hiện các kiểm tra này có thể được coi là một tạo tác lịch sử, mặc dù nó cho phép lưu trữ đơn giản (không cần xử lý) JSON Unicode thoát trong mã hóa cơ sở dữ liệu không hỗ trợ các ký tự được biểu thị

Khi chuyển đổi đầu vào JSON dạng văn bản thành

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7, các kiểu nguyên thủy được mô tả bởi RFC 7159 được ánh xạ một cách hiệu quả vào các kiểu PostgreSQL gốc, như minh họa trong. Do đó, có một số ràng buộc bổ sung nhỏ đối với những gì cấu thành dữ liệu
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 hợp lệ không áp dụng cho loại
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
6, cũng như JSON trong bản tóm tắt, tương ứng với các giới hạn về những gì có thể được biểu thị bằng loại dữ liệu cơ bản. Đáng chú ý,
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 sẽ từ chối các số nằm ngoài phạm vi của loại dữ liệu PostgreSQL
-- String exists as array element:
SELECT '["foo", "bar", "baz"]'::jsonb ? 'bar';

-- String exists as object key:
SELECT '{"foo": "bar"}'::jsonb ? 'foo';

-- Object values are not considered:
SELECT '{"foo": "bar"}'::jsonb ? 'bar';  -- yields false

-- As with containment, existence must match at the top level:
SELECT '{"foo": {"bar": "baz"}}'::jsonb ? 'bar'; -- yields false

-- A string is considered to exist if it matches a primitive JSON string:
SELECT '"foo"'::jsonb ? 'foo';
1, trong khi
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
6 thì không. Các hạn chế do triển khai xác định như vậy được RFC 7159 cho phép. Tuy nhiên, trong thực tế, các sự cố như vậy có nhiều khả năng xảy ra hơn trong các triển khai khác, vì thông thường biểu thị kiểu nguyên thủy
-- String exists as array element:
SELECT '["foo", "bar", "baz"]'::jsonb ? 'bar';

-- String exists as object key:
SELECT '{"foo": "bar"}'::jsonb ? 'foo';

-- Object values are not considered:
SELECT '{"foo": "bar"}'::jsonb ? 'bar';  -- yields false

-- As with containment, existence must match at the top level:
SELECT '{"foo": {"bar": "baz"}}'::jsonb ? 'bar'; -- yields false

-- A string is considered to exist if it matches a primitive JSON string:
SELECT '"foo"'::jsonb ? 'foo';
3 của JSON dưới dạng dấu phẩy động chính xác kép IEEE 754 (mà RFC 7159 dự đoán và cho phép rõ ràng). Khi sử dụng JSON làm định dạng trao đổi với các hệ thống như vậy, nên xem xét nguy cơ mất độ chính xác của số so với dữ liệu được lưu trữ ban đầu bởi PostgreSQL

Ngược lại, như đã lưu ý trong bảng, có một số hạn chế nhỏ đối với định dạng đầu vào của các kiểu nguyên thủy JSON không áp dụng cho các kiểu PostgreSQL tương ứng

Bảng 8. 23. Các loại nguyên thủy JSON và các loại PostgreSQL tương ứng

Kiểu nguyên thủy JSON Kiểu PostgreSQLGhi chú

-- String exists as array element:
SELECT '["foo", "bar", "baz"]'::jsonb ? 'bar';

-- String exists as object key:
SELECT '{"foo": "bar"}'::jsonb ? 'foo';

-- Object values are not considered:
SELECT '{"foo": "bar"}'::jsonb ? 'bar';  -- yields false

-- As with containment, existence must match at the top level:
SELECT '{"foo": {"bar": "baz"}}'::jsonb ? 'bar'; -- yields false

-- A string is considered to exist if it matches a primitive JSON string:
SELECT '"foo"'::jsonb ? 'foo';
4
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
5
-- This array contains the primitive string value:
SELECT '["foo", "bar"]'::jsonb @> '"bar"'::jsonb;

-- This exception is not reciprocal -- non-containment is reported here:
SELECT '"bar"'::jsonb @> '["bar"]'::jsonb;  -- yields false
2 không được phép, cũng như các ký tự thoát Unicode đại diện cho các ký tự không có sẵn trong mã hóa cơ sở dữ liệu
-- String exists as array element:
SELECT '["foo", "bar", "baz"]'::jsonb ? 'bar';

-- String exists as object key:
SELECT '{"foo": "bar"}'::jsonb ? 'foo';

-- Object values are not considered:
SELECT '{"foo": "bar"}'::jsonb ? 'bar';  -- yields false

-- As with containment, existence must match at the top level:
SELECT '{"foo": {"bar": "baz"}}'::jsonb ? 'bar'; -- yields false

-- A string is considered to exist if it matches a primitive JSON string:
SELECT '"foo"'::jsonb ? 'foo';
3
-- String exists as array element:
SELECT '["foo", "bar", "baz"]'::jsonb ? 'bar';

-- String exists as object key:
SELECT '{"foo": "bar"}'::jsonb ? 'foo';

-- Object values are not considered:
SELECT '{"foo": "bar"}'::jsonb ? 'bar';  -- yields false

-- As with containment, existence must match at the top level:
SELECT '{"foo": {"bar": "baz"}}'::jsonb ? 'bar'; -- yields false

-- A string is considered to exist if it matches a primitive JSON string:
SELECT '"foo"'::jsonb ? 'foo';
1
-- String exists as array element:
SELECT '["foo", "bar", "baz"]'::jsonb ? 'bar';

-- String exists as object key:
SELECT '{"foo": "bar"}'::jsonb ? 'foo';

-- Object values are not considered:
SELECT '{"foo": "bar"}'::jsonb ? 'bar';  -- yields false

-- As with containment, existence must match at the top level:
SELECT '{"foo": {"bar": "baz"}}'::jsonb ? 'bar'; -- yields false

-- A string is considered to exist if it matches a primitive JSON string:
SELECT '"foo"'::jsonb ? 'foo';
9 và
SELECT doc->'site_name' FROM websites
  WHERE doc @> '{"tags":[{"term":"paris"}, {"term":"food"}]}';
0 giá trị không được phép_______35_______1
SELECT doc->'site_name' FROM websites
  WHERE doc @> '{"tags":[{"term":"paris"}, {"term":"food"}]}';
1Chỉ chấp nhận cách viết chữ thường
SELECT doc->'site_name' FROM websites
  WHERE doc @> '{"tags":[{"term":"paris"}, {"term":"food"}]}';
3 và
SELECT doc->'site_name' FROM websites
  WHERE doc @> '{"tags":[{"term":"paris"}, {"term":"food"}]}';
__ một)_______6 Khái niệm SQL khác nhau 35(n)


8. 14. 1. Cú pháp đầu vào và đầu ra JSON

Cú pháp đầu vào/đầu ra cho các loại dữ liệu JSON được chỉ định trong RFC 7159

Sau đây là tất cả các biểu thức

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
6 (hoặc
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7) hợp lệ

-- Simple scalar/primitive value
-- Primitive values can be numbers, quoted strings, true, false, or null
SELECT '5'::json;

-- Array of zero or more elements (elements need not be of same type)
SELECT '[1, 2, "foo", null]'::json;

-- Object containing pairs of keys and values
-- Note that object keys must always be quoted strings
SELECT '{"bar": "baz", "balance": 7.77, "active": false}'::json;

-- Arrays and objects can be nested arbitrarily
SELECT '{"foo": [true, "bar"], "tags": {"a": 1, "b": null}}'::json;

Như đã nêu trước đây, khi một giá trị JSON được nhập và sau đó được in mà không có bất kỳ xử lý bổ sung nào, thì ___________6 sẽ xuất ra cùng một văn bản được nhập vào, trong khi ___________7 không lưu giữ các chi tiết không quan trọng về mặt ngữ nghĩa như khoảng trắng. Ví dụ, lưu ý sự khác biệt ở đây

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)

Một chi tiết không quan trọng về mặt ngữ nghĩa đáng chú ý là trong

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7, các số sẽ được in theo hành vi của loại
-- String exists as array element:
SELECT '["foo", "bar", "baz"]'::jsonb ? 'bar';

-- String exists as object key:
SELECT '{"foo": "bar"}'::jsonb ? 'foo';

-- Object values are not considered:
SELECT '{"foo": "bar"}'::jsonb ? 'bar';  -- yields false

-- As with containment, existence must match at the top level:
SELECT '{"foo": {"bar": "baz"}}'::jsonb ? 'bar'; -- yields false

-- A string is considered to exist if it matches a primitive JSON string:
SELECT '"foo"'::jsonb ? 'foo';
1 bên dưới. Trong thực tế, điều này có nghĩa là các số được nhập bằng ký hiệu
SELECT doc->'site_name' FROM websites
  WHERE doc->'tags' @> '[{"term":"paris"}, {"term":"food"}]';
3 sẽ được in mà không có ký hiệu đó, chẳng hạn

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)

Tuy nhiên,

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 sẽ giữ nguyên các số 0 phân số ở cuối, như đã thấy trong ví dụ này, mặc dù chúng không có ý nghĩa về mặt ngữ nghĩa đối với các mục đích như kiểm tra đẳng thức

Để biết danh sách các hàm và toán tử tích hợp có sẵn để xây dựng và xử lý các giá trị JSON, hãy xem Phần 9. 16

8. 14. 2. Thiết kế tài liệu JSON

Biểu diễn dữ liệu dưới dạng JSON có thể linh hoạt hơn đáng kể so với mô hình dữ liệu quan hệ truyền thống, điều này hấp dẫn trong các môi trường có yêu cầu linh hoạt. Hoàn toàn có thể cả hai phương pháp cùng tồn tại và bổ sung cho nhau trong cùng một ứng dụng. Tuy nhiên, ngay cả đối với các ứng dụng cần tính linh hoạt tối đa, các tài liệu JSON vẫn nên có cấu trúc hơi cố định. Cấu trúc này thường không được thực thi (mặc dù có thể thực thi một số quy tắc kinh doanh theo cách khai báo), nhưng có một cấu trúc có thể dự đoán được sẽ giúp viết các truy vấn tóm tắt một cách hữu ích một tập hợp “tài liệu” (dữ liệu) trong một bảng dễ dàng hơn

Dữ liệu JSON phải tuân theo các cân nhắc kiểm soát đồng thời giống như bất kỳ loại dữ liệu nào khác khi được lưu trữ trong bảng. Mặc dù có thể lưu trữ các tài liệu lớn, nhưng hãy nhớ rằng bất kỳ bản cập nhật nào cũng có khóa cấp hàng trên toàn bộ hàng. Cân nhắc giới hạn các tài liệu JSON ở kích thước có thể quản lý để giảm tranh chấp khóa giữa các giao dịch cập nhật. Lý tưởng nhất là mỗi tài liệu JSON phải đại diện cho một dữ liệu nguyên tử mà các quy tắc kinh doanh quy định không thể được chia nhỏ một cách hợp lý thành các dữ liệu nhỏ hơn có thể được sửa đổi một cách độc lập

8. 14. 3. SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb; json | jsonb -----------------------+------------------------- {"reading": 1.230e-5} | {"reading": 0.00001230} (1 row) 7 Ngăn chặn và Tồn tại

Kiểm tra ngăn chặn là một khả năng quan trọng của

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7. Không có bộ cơ sở song song cho loại
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
6. Kiểm tra ngăn chặn xem một tài liệu
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 có chứa một tài liệu khác hay không. Những ví dụ này trả về true trừ khi được ghi chú

-- Simple scalar/primitive values contain only the identical value:
SELECT '"foo"'::jsonb @> '"foo"'::jsonb;

-- The array on the right side is contained within the one on the left:
SELECT '[1, 2, 3]'::jsonb @> '[1, 3]'::jsonb;

-- Order of array elements is not significant, so this is also true:
SELECT '[1, 2, 3]'::jsonb @> '[3, 1]'::jsonb;

-- Duplicate array elements don't matter either:
SELECT '[1, 2, 3]'::jsonb @> '[1, 2, 2]'::jsonb;

-- The object with a single pair on the right side is contained
-- within the object on the left side:
SELECT '{"product": "PostgreSQL", "version": 9.4, "jsonb": true}'::jsonb @> '{"version": 9.4}'::jsonb;

-- The array on the right side is not considered contained within the
-- array on the left, even though a similar array is nested within it:
SELECT '[1, 2, [1, 3]]'::jsonb @> '[1, 3]'::jsonb;  -- yields false

-- But with a layer of nesting, it is contained:
SELECT '[1, 2, [1, 3]]'::jsonb @> '[[1, 3]]'::jsonb;

-- Similarly, containment is not reported here:
SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"bar": "baz"}'::jsonb;  -- yields false

-- A top-level key and an empty object is contained:
SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"foo": {}}'::jsonb;

Nguyên tắc chung là đối tượng chứa phải khớp với đối tượng chứa về cấu trúc và nội dung dữ liệu, có thể sau khi loại bỏ một số phần tử mảng không khớp hoặc cặp khóa/giá trị đối tượng khỏi đối tượng chứa. Nhưng hãy nhớ rằng thứ tự của các phần tử mảng không quan trọng khi thực hiện khớp ngăn chặn và các phần tử mảng trùng lặp chỉ được xem xét hiệu quả một lần

Là một ngoại lệ đặc biệt đối với nguyên tắc chung là các cấu trúc phải khớp nhau, một mảng có thể chứa một giá trị nguyên thủy

-- This array contains the primitive string value:
SELECT '["foo", "bar"]'::jsonb @> '"bar"'::jsonb;

-- This exception is not reciprocal -- non-containment is reported here:
SELECT '"bar"'::jsonb @> '["bar"]'::jsonb;  -- yields false

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 cũng có một toán tử tồn tại, đây là một biến thể của chủ đề ngăn chặn. nó kiểm tra xem một chuỗi (được cung cấp dưới dạng giá trị
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
5) có xuất hiện dưới dạng khóa đối tượng hoặc phần tử mảng ở cấp cao nhất của giá trị
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 hay không. Những ví dụ này trả về true trừ khi được ghi chú

-- String exists as array element:
SELECT '["foo", "bar", "baz"]'::jsonb ? 'bar';

-- String exists as object key:
SELECT '{"foo": "bar"}'::jsonb ? 'foo';

-- Object values are not considered:
SELECT '{"foo": "bar"}'::jsonb ? 'bar';  -- yields false

-- As with containment, existence must match at the top level:
SELECT '{"foo": {"bar": "baz"}}'::jsonb ? 'bar'; -- yields false

-- A string is considered to exist if it matches a primitive JSON string:
SELECT '"foo"'::jsonb ? 'foo';

Các đối tượng JSON phù hợp hơn mảng để kiểm tra khả năng chứa hoặc tồn tại khi có nhiều khóa hoặc phần tử liên quan, bởi vì không giống như mảng, chúng được tối ưu hóa bên trong để tìm kiếm và không cần tìm kiếm tuyến tính

Mẹo

Vì ngăn chặn JSON được lồng vào nhau, một truy vấn thích hợp có thể bỏ qua lựa chọn rõ ràng của các đối tượng con. Ví dụ, giả sử rằng chúng ta có một cột

CREATE INDEX idxgin ON api USING GIN (jdoc);
2 chứa các đối tượng ở cấp cao nhất, với hầu hết các đối tượng chứa các trường
CREATE INDEX idxgin ON api USING GIN (jdoc);
3 chứa các mảng đối tượng con. Truy vấn này tìm các mục trong đó các đối tượng phụ chứa cả
CREATE INDEX idxgin ON api USING GIN (jdoc);
4 và
CREATE INDEX idxgin ON api USING GIN (jdoc);
5 xuất hiện, trong khi bỏ qua bất kỳ khóa nào như vậy bên ngoài mảng
CREATE INDEX idxgin ON api USING GIN (jdoc);
3

SELECT doc->'site_name' FROM websites
  WHERE doc @> '{"tags":[{"term":"paris"}, {"term":"food"}]}';

Người ta có thể hoàn thành điều tương tự với, nói,

SELECT doc->'site_name' FROM websites
  WHERE doc->'tags' @> '[{"term":"paris"}, {"term":"food"}]';

nhưng cách tiếp cận đó kém linh hoạt hơn và thường kém hiệu quả hơn

Mặt khác, toán tử tồn tại JSON không được lồng vào nhau. nó sẽ chỉ tìm phần tử mảng hoặc khóa được chỉ định ở cấp cao nhất của giá trị JSON

Các toán tử tồn tại và ngăn chặn khác nhau, cùng với tất cả các toán tử và hàm JSON khác được ghi lại trong Phần 9. 16

Chỉ mục GIN có thể được sử dụng để tìm kiếm khóa hoặc cặp khóa/giá trị xuất hiện trong một số lượng lớn

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 tài liệu (dữ liệu) một cách hiệu quả. Hai "lớp toán tử" GIN được cung cấp, mang đến sự đánh đổi hiệu suất và tính linh hoạt khác nhau

Lớp toán tử GIN mặc định cho

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 hỗ trợ các truy vấn với toán tử tồn tại khóa
CREATE INDEX idxgin ON api USING GIN (jdoc);
9,
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
0 và
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
1, toán tử ngăn chặn
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
2 và toán tử đối sánh
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
8
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
4 và
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
5. (Để biết chi tiết về ngữ nghĩa mà các toán tử này thực hiện, hãy xem. ) Một ví dụ về việc tạo chỉ mục với lớp toán tử này là

CREATE INDEX idxgin ON api USING GIN (jdoc);

Lớp toán tử GIN không mặc định

CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
6 không hỗ trợ các toán tử tồn tại khóa, nhưng nó hỗ trợ
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
2,
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
4 và
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
5. Một ví dụ về việc tạo chỉ mục với lớp toán tử này là

CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);

Xem xét ví dụ về bảng lưu trữ các tài liệu JSON được truy xuất từ ​​dịch vụ web của bên thứ ba, với định nghĩa lược đồ được ghi lại. Một tài liệu điển hình là

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
0

Chúng tôi lưu trữ các tài liệu này trong một bảng có tên là

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
00, trong một cột
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 có tên là
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
02. Nếu chỉ mục GIN được tạo trên cột này, các truy vấn như sau có thể sử dụng chỉ mục

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
1

Tuy nhiên, không thể sử dụng chỉ mục cho các truy vấn như sau, bởi vì mặc dù toán tử

CREATE INDEX idxgin ON api USING GIN (jdoc);
9 có thể lập chỉ mục, nhưng nó không được áp dụng trực tiếp cho cột được lập chỉ mục
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
02

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
2

Tuy nhiên, với việc sử dụng thích hợp các chỉ mục biểu thức, truy vấn trên có thể sử dụng một chỉ mục. Nếu việc truy vấn các mục cụ thể trong khóa

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
05 là phổ biến, thì việc xác định một chỉ mục như thế này có thể đáng giá

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
3

Bây giờ, mệnh đề

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
06
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
07 sẽ được công nhận là một ứng dụng của toán tử có thể lập chỉ mục
CREATE INDEX idxgin ON api USING GIN (jdoc);
9 cho biểu thức được lập chỉ mục
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
09. (Bạn có thể tìm thêm thông tin về chỉ mục biểu thức trong Phần 11. 7. )

Một cách tiếp cận khác để truy vấn là khai thác ngăn chặn, ví dụ

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
4

Chỉ mục GIN đơn giản trên cột

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
02 có thể hỗ trợ truy vấn này. Nhưng lưu ý rằng một chỉ mục như vậy sẽ lưu trữ các bản sao của mọi khóa và giá trị trong cột
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
02, trong khi chỉ mục biểu thức của ví dụ trước chỉ lưu trữ dữ liệu được tìm thấy trong khóa
CREATE INDEX idxgin ON api USING GIN (jdoc);
3. Mặc dù cách tiếp cận chỉ mục đơn giản linh hoạt hơn nhiều (vì nó hỗ trợ các truy vấn về bất kỳ khóa nào), các chỉ mục biểu thức được nhắm mục tiêu có thể nhỏ hơn và tìm kiếm nhanh hơn so với chỉ mục đơn giản.

Các chỉ mục GIN cũng hỗ trợ các toán tử

CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
4 và
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
5, thực hiện so khớp
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
8. Ví dụ là

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
5
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
6

Đối với các toán tử này, chỉ mục GIN trích xuất các mệnh đề có dạng

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
16 =
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
17 ra khỏi mẫu
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
8 và thực hiện tìm kiếm chỉ mục dựa trên các khóa và giá trị được đề cập trong các mệnh đề này. Chuỗi bộ truy cập có thể bao gồm bộ truy cập
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
19,
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
20 và
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
21]. Lớp toán tử
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
22 cũng hỗ trợ các bộ truy cập
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
23 và
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
24, nhưng lớp toán tử
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
6 thì không

Mặc dù lớp toán tử

CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
6 chỉ hỗ trợ các truy vấn với các toán tử
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
2,
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
4 và
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
5, nhưng nó có những ưu điểm đáng chú ý về hiệu năng so với lớp toán tử mặc định
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
22. Chỉ mục
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
6 thường nhỏ hơn nhiều so với chỉ mục
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
22 trên cùng một dữ liệu và tính cụ thể của các tìm kiếm tốt hơn, đặc biệt khi các truy vấn chứa các khóa xuất hiện thường xuyên trong dữ liệu. Do đó, các hoạt động tìm kiếm thường hoạt động tốt hơn so với lớp toán tử mặc định

Sự khác biệt về kỹ thuật giữa chỉ mục GIN của

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
22 và
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
6 là chỉ số GIN trước tạo các mục chỉ mục độc lập cho từng khóa và giá trị trong dữ liệu, trong khi chỉ mục sau chỉ tạo các mục chỉ mục cho từng giá trị trong dữ liệu. Về cơ bản, mỗi mục chỉ mục
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
6 là một hàm băm của giá trị và (các) khóa dẫn đến nó; . Do đó, một truy vấn ngăn chặn tìm kiếm cấu trúc này sẽ dẫn đến một tìm kiếm chỉ mục cực kỳ cụ thể; . Mặt khác, một chỉ mục
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
22 sẽ tạo ra ba mục chỉ mục đại diện cho
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
37,
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
38 và
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
39 một cách riêng biệt; . Mặc dù các chỉ mục GIN có thể thực hiện tìm kiếm AND như vậy khá hiệu quả, nhưng nó vẫn sẽ kém cụ thể hơn và chậm hơn so với tìm kiếm
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
6 tương đương, đặc biệt nếu có một số lượng rất lớn các hàng chứa bất kỳ một trong ba mục chỉ mục nào

Nhược điểm của cách tiếp cận

CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
6 là nó không tạo ra các mục nhập chỉ mục cho các cấu trúc JSON không chứa bất kỳ giá trị nào, chẳng hạn như
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
47. Nếu yêu cầu tìm kiếm các tài liệu chứa cấu trúc như vậy, nó sẽ yêu cầu quét toàn bộ chỉ mục, quá trình này khá chậm. Do đó,
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
6 không phù hợp với các ứng dụng thường thực hiện các tìm kiếm như vậy

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 cũng hỗ trợ các chỉ mục
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
50 và
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
51. Chúng thường chỉ hữu ích nếu điều quan trọng là phải kiểm tra tính bằng nhau của các tài liệu JSON hoàn chỉnh. Thứ tự
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
50 cho dữ kiện dữ liệu
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 hiếm khi được quan tâm nhiều, nhưng về tính đầy đủ thì nó

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
7

Các đối tượng có số cặp bằng nhau được so sánh theo thứ tự

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
8

Lưu ý rằng các khóa đối tượng được so sánh theo thứ tự lưu trữ của chúng;

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
9

Tương tự, các mảng có số phần tử bằng nhau được so sánh theo thứ tự

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
0

Các giá trị JSON nguyên thủy được so sánh bằng cách sử dụng các quy tắc so sánh giống như đối với kiểu dữ liệu PostgreSQL cơ bản. Các chuỗi được so sánh bằng cách sử dụng đối chiếu cơ sở dữ liệu mặc định

Kiểu dữ liệu

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 hỗ trợ các biểu thức đăng ký kiểu mảng để trích xuất và sửa đổi các phần tử. Các giá trị lồng nhau có thể được biểu thị bằng cách xâu chuỗi các biểu thức đăng ký, tuân theo các quy tắc tương tự như đối số
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
55 trong hàm
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
56. Nếu một giá trị
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 là một mảng, các chỉ số dưới dạng số bắt đầu từ 0 và các số nguyên âm được đếm ngược từ phần tử cuối cùng của mảng. Biểu thức lát cắt không được hỗ trợ. Kết quả của một biểu thức đăng ký luôn có kiểu dữ liệu jsonb

Các câu lệnh

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
58 có thể sử dụng chỉ số phụ trong mệnh đề
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
59 để sửa đổi các giá trị của
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7. Đường dẫn chỉ số phải có thể duyệt qua đối với tất cả các giá trị bị ảnh hưởng trong chừng mực chúng tồn tại. Chẳng hạn, đường dẫn
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
61 có thể được duyệt hết đến
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
62 nếu mọi
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
63,
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
64 và
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
65 là một đối tượng. Nếu bất kỳ
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
64 hoặc
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
65 nào không được xác định, nó sẽ được tạo dưới dạng một đối tượng trống và được điền khi cần thiết. Tuy nhiên, nếu bất kỳ bản thân
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
63 nào hoặc một trong các giá trị trung gian được định nghĩa là không phải đối tượng, chẳng hạn như chuỗi, số hoặc
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7
SELECT doc->'site_name' FROM websites
  WHERE doc @> '{"tags":[{"term":"paris"}, {"term":"food"}]}';
5, quá trình truyền tải không thể tiến hành nên sẽ xảy ra lỗi và giao dịch bị hủy bỏ

Một ví dụ về cú pháp đăng ký

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
1

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 chuyển nhượng thông qua đăng ký xử lý một vài trường hợp cạnh khác với
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
56. Khi một giá trị
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 nguồn là
SELECT doc->'site_name' FROM websites
  WHERE doc @> '{"tags":[{"term":"paris"}, {"term":"food"}]}';
6, việc gán thông qua chỉ số con sẽ tiến hành như thể đó là một giá trị JSON trống của loại (đối tượng hoặc mảng) được ngụ ý bởi khóa chỉ số

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
2

Nếu một chỉ mục được chỉ định cho một mảng chứa quá ít phần tử, các phần tử

SELECT doc->'site_name' FROM websites
  WHERE doc @> '{"tags":[{"term":"paris"}, {"term":"food"}]}';
6 sẽ được thêm vào cho đến khi có thể truy cập chỉ mục và có thể đặt giá trị

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
3

Giá trị

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 sẽ chấp nhận gán cho các đường dẫn chỉ số dưới không tồn tại miễn là phần tử tồn tại cuối cùng được duyệt qua là một đối tượng hoặc mảng, như được ngụ ý bởi chỉ số tương ứng (phần tử được chỉ ra bởi chỉ số cuối cùng trong đường dẫn không được duyệt qua và có thể là bất kỳ thứ gì . Các cấu trúc mảng và đối tượng lồng nhau sẽ được tạo và trong trường hợp trước đây là
SELECT doc->'site_name' FROM websites
  WHERE doc @> '{"tags":[{"term":"paris"}, {"term":"food"}]}';
5-đệm, như được chỉ định bởi đường dẫn chỉ số cho đến khi có thể đặt giá trị được chỉ định

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
4

Các phần mở rộng bổ sung có sẵn để triển khai các phép biến đổi cho loại

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 cho các ngôn ngữ thủ tục khác nhau

Các phần mở rộng cho PL/Perl được gọi là

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
79 và
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
80. Nếu bạn sử dụng chúng, các giá trị
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 được ánh xạ tới các mảng Perl, giá trị băm và vô hướng, nếu phù hợp

Phần mở rộng cho PL/Python được gọi là

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
82. Nếu bạn sử dụng nó, các giá trị
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
7 được ánh xạ tới từ điển Python, danh sách và đại lượng vô hướng, nếu phù hợp

Trong số các tiện ích mở rộng này,

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
79 được coi là "đáng tin cậy", nghĩa là nó có thể được cài đặt bởi những người không phải là siêu người dùng có đặc quyền
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
85 trên cơ sở dữ liệu hiện tại. Phần còn lại yêu cầu đặc quyền siêu người dùng để cài đặt

Loại

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
8 triển khai hỗ trợ cho ngôn ngữ đường dẫn SQL/JSON trong PostgreSQL để truy vấn dữ liệu JSON một cách hiệu quả. Nó cung cấp một biểu diễn nhị phân của biểu thức đường dẫn SQL/JSON được phân tích cú pháp chỉ định các mục sẽ được công cụ đường dẫn truy xuất từ ​​dữ liệu JSON để xử lý thêm bằng các hàm truy vấn SQL/JSON

Ngữ nghĩa của các vị từ và toán tử đường dẫn SQL/JSON thường tuân theo SQL. Đồng thời, để cung cấp cách làm việc tự nhiên với dữ liệu JSON, cú pháp đường dẫn SQL/JSON sử dụng một số quy ước JavaScript

  • Dấu chấm (

    SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                          json
    -------------------------------------------------
     {"bar": "baz", "balance": 7.77, "active":false}
    (1 row)
    
    SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                          jsonb
    --------------------------------------------------
     {"bar": "baz", "active": false, "balance": 7.77}
    (1 row)
    
    87) được sử dụng để truy cập thành viên

  • Dấu ngoặc vuông (

    SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                          json
    -------------------------------------------------
     {"bar": "baz", "balance": 7.77, "active":false}
    (1 row)
    
    SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                          jsonb
    --------------------------------------------------
     {"bar": "baz", "active": false, "balance": 7.77}
    (1 row)
    
    88) được sử dụng để truy cập mảng

  • Các mảng SQL/JSON có liên quan đến 0, không giống như các mảng SQL thông thường bắt đầu từ 1

Biểu thức đường dẫn SQL/JSON thường được viết trong truy vấn SQL dưới dạng chuỗi ký tự SQL, do đó, nó phải được đặt trong dấu nháy đơn và bất kỳ dấu nháy đơn nào mong muốn trong giá trị phải được nhân đôi (xem ). Một số dạng biểu thức đường dẫn yêu cầu chuỗi ký tự bên trong chúng. Các chuỗi ký tự được nhúng này tuân theo các quy ước JavaScript/ECMAScript. chúng phải được bao quanh bởi dấu ngoặc kép và dấu gạch chéo ngược có thể được sử dụng bên trong chúng để biểu thị các ký tự khó nhập. Cụ thể, cách viết một trích dẫn kép trong một chuỗi ký tự được nhúng là

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
89 và để viết chính dấu gạch chéo ngược, bạn phải viết
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
90. Các chuỗi dấu gạch chéo ngược đặc biệt khác bao gồm các chuỗi được nhận dạng trong chuỗi JSON.
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
91,
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
92,
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
93,
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
94,
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
95,
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
96 cho các ký tự điều khiển ASCII khác nhau và
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
97 cho ký tự Unicode được xác định bởi điểm mã 4 chữ số hex của nó. Cú pháp dấu gạch chéo ngược cũng bao gồm hai trường hợp không được JSON cho phép.
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
98 đối với mã ký tự được viết chỉ bằng hai chữ số hex và
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
99} đối với mã ký tự được viết bằng 1 đến 6 chữ số hex

Biểu thức đường dẫn bao gồm một chuỗi các phần tử đường dẫn, có thể là bất kỳ phần tử nào sau đây

  • Đường dẫn bằng chữ của các kiểu nguyên thủy JSON. Văn bản Unicode, số, đúng, sai hoặc null

  • Các biến đường dẫn được liệt kê trong

  • Toán tử truy cập được liệt kê trong

  • SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
             json          |          jsonb
    -----------------------+-------------------------
     {"reading": 1.230e-5} | {"reading": 0.00001230}
    (1 row)
    
    8 toán tử và phương thức được liệt kê trong

  • Dấu ngoặc đơn, có thể được sử dụng để cung cấp biểu thức bộ lọc hoặc xác định thứ tự đánh giá đường dẫn

Để biết chi tiết về cách sử dụng các biểu thức

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
8 với các hàm truy vấn SQL/JSON, hãy xem

Bảng 8. 24.

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
8 Biến

Mô tả biến

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
03Một biến đại diện cho giá trị JSON đang được truy vấn (mục ngữ cảnh).
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
04Một biến được đặt tên. Giá trị của nó có thể được đặt theo tham số
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
05 của một số hàm xử lý JSON; .
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
06Một biến đại diện cho kết quả đánh giá đường dẫn trong các biểu thức bộ lọc


Bảng 8. 25.

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
8 phụ kiện

Toán tử AccessorMô tả

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
19

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
09"

Trình truy cập thành viên trả về một thành viên đối tượng với khóa đã chỉ định. Nếu tên khóa khớp với một số biến được đặt tên bắt đầu bằng

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
03 hoặc không đáp ứng các quy tắc JavaScript cho mã định danh, thì nó phải được đặt trong dấu ngoặc kép để biến nó thành một chuỗi ký tự

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
23

Trình truy cập thành viên ký tự đại diện trả về giá trị của tất cả các thành viên nằm ở cấp cao nhất của đối tượng hiện tại

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
24

Trình truy cập thành viên ký tự đại diện đệ quy xử lý tất cả các cấp của hệ thống phân cấp JSON của đối tượng hiện tại và trả về tất cả các giá trị thành viên, bất kể cấp độ lồng nhau của chúng. Đây là một phần mở rộng PostgreSQL của tiêu chuẩn SQL/JSON

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
13}

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
14 đến
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
15}

Giống như

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
                      json
-------------------------------------------------
 {"bar": "baz", "balance": 7.77, "active":false}
(1 row)

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
                      jsonb
--------------------------------------------------
 {"bar": "baz", "active": false, "balance": 7.77}
(1 row)
24, nhưng chỉ chọn các cấp được chỉ định của cấu trúc phân cấp JSON. Các mức lồng nhau được chỉ định dưới dạng số nguyên. Mức 0 tương ứng với đối tượng hiện tại. Để truy cập mức lồng nhau thấp nhất, bạn có thể sử dụng từ khóa
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
17. Đây là một phần mở rộng PostgreSQL của tiêu chuẩn SQL/JSON

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
18,. ]

Trình truy cập phần tử mảng.

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
19 có thể được đưa ra dưới hai hình thức.
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
20 hoặc
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
21 đến
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
22. Biểu mẫu đầu tiên trả về một phần tử mảng duy nhất theo chỉ mục của nó. Biểu mẫu thứ hai trả về một lát mảng theo phạm vi chỉ mục, bao gồm các phần tử tương ứng với
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
23 và
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
22 đã cung cấp

SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
25 được chỉ định có thể là một số nguyên, cũng như một biểu thức trả về một giá trị số duy nhất, được tự động chuyển thành số nguyên. Chỉ số 0 tương ứng với phần tử mảng đầu tiên. Bạn cũng có thể sử dụng từ khóa
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
         json          |          jsonb
-----------------------+-------------------------
 {"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row)
17 để biểu thị phần tử cuối cùng của mảng, rất hữu ích để xử lý các mảng có độ dài không xác định