Skip to main content

JSONB

使用 JSONB 数据类型创建一个能够存储 JSON 数据的列。

注意:

  • IEEE 754 双精度浮点数无法表示的数字可能互操作性较差,尤其是 bigint 类型中大于 (2**53)-1 的数字。
  • 避免在 GROUP BYORDER BY 子句或 PRIMARYINDEX 键中使用 JSONB 列。确切的行为未来可能会发生变化。
    • 建议的用法是提取目标字段并转换为简单类型。
  • 如果字符串中包含 JSON 数据..
    • 如果 schema 已知,请使用 STRUCT
    • 或使用 VARCHAR 并在稍后将其转换为 JSONB

定义 JSONB 类型

句法: JSONB

示例

下面的语句可创建一个名为 x 的表,其中包含一个名为 j_dataJSONB 列。

CREATE TABLE x (j_data JSONB, d INTEGER);

下面的语句可创建一个名为 y 的表,其中包含一个名为 metadataJSONB 列。

CREATE TABLE y (id VARCHAR, metadata JSONB);

下面是一个实际示例。

CREATE TABLE product (
name VARCHAR,
price NUMERIC,
attributes JSONB
);

向 JSONB 列添加值

要向 JSONB 列添加值,只需将 JSON 作为字符串写入。例如,'{"key": "value"}'

示例

下面的语句可向表 x 添加值。

INSERT INTO x VALUES ('{"a": 3, "b": 4}', 5);

下面的语句可向表 y 添加值。

INSERT INTO y VALUES ('ABCD1234', '{"color": "blue", "size": "M"}');

下面的语句可向表 product 添加值。

INSERT INTO product (name, price, attributes)
VALUES
(
'T-Shirt',
19.99,
'{"color": "red", "size": "L"}'
);

从 JSONB 列检索数据和转换

要从 JSONB 列中检索数据,可使用 ->->> 操作符访问 JSON 对象的属性。操作符 -> 可返回一个 jsonb 值,而操作符 ->> 可返回一个 varchar 值。

有关 JSON 操作符的详细信息,请参阅 JSON 操作符

JSONB 数据类型可被转换为其他数据类型,如 bool、smallint、int、bigint、decimal、real 和 double precision。转换时使用 ::data-type 转换符号,例如 ::int 用于将其转换为整数数据类型。

示例

以下是一些检索数据和转换的示例:

INSERT INTO product VALUES ('USB cable', 4.99, '{"lengthInFeet": 3, "backorder": true, "brand": "sin90", "compatible": ["pc", "mac", "phone"]}');

SELECT
(attributes -> 'lengthInFeet')::INT * 30.48 AS cm,
NOT (attributes -> 'backorder')::BOOL AS available,
UPPER(attributes ->> 'brand') AS brand_good,
UPPER((attributes -> 'brand')::VARCHAR) AS brand_bad,
attributes -> 'compatible'
FROM product;

-----返回结果

cm | available | brand_good | brand_bad | ?column?
-------+-----------+------------+-----------+------------------------
91.44 | f | SIN90 | "SIN90" | ["pc", "mac", "phone"]
(1 row)

输出结果显示,brand_bad 列包含额外的双引号。因此,当目标列是 varchar 时,直接使用专用操作符 ->> 而不使用转换。仅在布尔或数字时进行转换。

JSONB 函数和操作符

有关 JSON 和 JSONB 函数和操作符的完整列表,请参阅 JSON 函数和操作符