JSONB
使用 JSONB
数据类型创建一个能够存储 JSON 数据的列。
注意:
- IEEE 754 双精度浮点数无法表示的数字可能互操作性较差,尤其是
bigint
类型中大于(2**53)-1
的数字。 - 避免在
GROUP BY
和ORDER BY
子句或PRIMARY
和INDEX
键中使用JSONB
列。确切的行为未来可能会发生变化。- 建议的用法是提取目标字段并转换为简单类型。
- 如果字符串中包含 JSON 数据..
- 如果 schema 已知,请使用
STRUCT
, - 或使用
VARCHAR
并在稍后将其转换为JSONB
。
- 如果 schema 已知,请使用
定义 JSONB 类型
句法:
JSONB
示例
下面的语句可创建一个名为 x
的表,其中包含一个名为 j_data
的 JSONB
列。
CREATE TABLE x (j_data JSONB, d INTEGER);
下面的语句可创建一个名为 y
的表,其中包含一个名为 metadata
的 JSONB
列。
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 函数和操作符。