Postgres 提供 2 个运算符来获取 JSON 成员:
- 箭头运算符:
-> 返回 JSON 或 JSONB 类型
- 双箭头运算符:
->> 返回文本类型
我们还必须了解,我们现在有 2 种不同的 null:
-
(null) postgres null 类型
-
null json/b 空类型
我在jsfiddle上创建了一个示例
让我们创建一个带有 JSONB 字段的简单表:
create table json_test (
id integer,
val JSONB
);
并插入一些测试数据:
INSERT INTO json_test (id, val) values
(1, jsonb_build_object('member', null)),
(2, jsonb_build_object('member', 12)),
(3, null);
我们在 sqlfiddle 中看到的输出:
id | val
----+-----------------
1 | {"member": null}
2 | {"member": 12}
3 | (null)
注意事项:
- 包含一个 JSONB 对象,并且唯一的字段
member 是 null
- 包含一个 JSONB 对象,并且唯一的字段
member 具有数值 12
- 为(null):即整列为(null)且不包含JSONB完全反对
为了更好地理解差异,让我们看看类型和空检查:
SELECT id,
val -> 'member' as arrow,
pg_typeof(val -> 'member') as arrow_pg_type,
val -> 'member' IS NULL as arrow_is_null,
val ->> 'member' as dbl_arrow,
pg_typeof(val ->> 'member') as dbl_arrow_pg_type,
val ->> 'member' IS NULL as dbl_arrow_is_null,
CASE WHEN jsonb_typeof(val -> 'member') = 'null' THEN true ELSE false END as is_json_null
from json_test;
输出:
+----+--------+---------------+---------------+-----------+-------------------+-------------------+--------------+
| id | arrow | arrow_pg_type | arrow_is_null | dbl_arrow | dbl_arrow_pg_type | dbl_arrow_is_null | is_json_null |
+----+--------+---------------+---------------+-----------+-------------------+-------------------+--------------+
| 1 | null | jsonb | false | (null) | text | true | true |
+----+--------+---------------+---------------+-----------+-------------------+-------------------+--------------+
| 2 | 12 | jsonb | false | 12 | text | false | false |
+----+--------+---------------+---------------+-----------+-------------------+-------------------+--------------+
| 3 | (null) | jsonb | true | (null) | text | true | false |
+----+--------+---------------+---------------+-----------+-------------------+-------------------+--------------+
注意事项:
- 对于
{"member": null}:
-
val -> 'member' IS NULL 是 假
-
val ->> 'member' IS NULL 是真的
-
is_json_null 可用于获取only json-null 条件