Cheat Sheet速查表
跳转到主要内容

PostgreSQL JSON 速查表

本文根据 Devhints / PostgreSQL JSON 翻译。代码示例及版本范围沿用原文。原文标注更新日期:2018-12-06。

运算符

访问器

SELECT * FROM users WHERE data->>'name' = 'John';
SELECT data->>'name' AS name FROM users;
运算符说明示例返回值
-> int获取数组元素 2data->2JSON
-> text获取对象键 namedata->'name'JSON
#> text[]获取键路径 a,b (例如, data.a.b)data#>'{a,b}'JSON
->> int获取数组元素 2data->>2文本
->> text获取对象键 namedata->>'name'文本
#>> text[]获取键路径 a,b (例如, data.a.b)data#>>'{a,b}'文本

> 返回 JSON, >> 返回 text。

布尔运算符

SELECT * FROM users WHERE data->tags ? 'admin';
SELECT data->tags ? 'admin' AS is_admin FROM users;
运算符说明示例
? str是否 data 包含键 name?data ? 'name'
?| text[]是否 data 包含 a 或 b?data ?| array['a','b']
?& text[]是否 data 包含 a 以及 b?data ?& array['a','b']
@> jsonb是否 left 包含 right?data @> '{"b":2}'::jsonb
<@ jsonb是否 right 包含 left?data <@ '{"a":1,"b":2}'::jsonb

当 ?/?|/?& 作用于对象时,它检查键;当作用于数组时,它检查元素。

更新

数组与对象

UPDATE users SET tags = tags || array['admin'];
运算符示例说明
|| jsondata || array['a','b']连接
- strdata - 'a'删除键
- intdata - 1删除数组项
#- text[]data #- '{us,name}'删除路径

仅在 PostgreSQL 9.5 及以上版本中可用。

jsonb_set

UPDATE users SET data = jsonb_set(data, '{name}', '"John"');

仅在 PostgreSQL 9.5 及以上版本中可用。

函数

fn(json) → json

jsonb_set(data, '{path}', value)
jsonb_strip_nulls(data)

fn(···) → json

to_json("Hello"::text)
array_to_json('{1,2}'::int[])

迭代

SELECT * from json_each('{"a":1, "b":2}')
SELECT * from json_each_text('{"a":1, "b":2}')
-- key | value

这只是一个不完整的列表,函数实在太多了!

参见: JSON 函数

更多示例

  • '{"a":1}'::jsonb ? 'a'
  • '["a"]'::jsonb ? 'a'

参考资料