本文根据 Devhints / PostgreSQL JSON 翻译。代码示例及版本范围沿用原文。原文标注更新日期:2018-12-06。
运算符
访问器
SELECT * FROM users WHERE data->>'name' = 'John';
SELECT data->>'name' AS name FROM users;
| 运算符 | 说明 | 示例 | 返回值 |
|---|---|---|---|
-> int | 获取数组元素 2 | data->2 | JSON |
-> text | 获取对象键 name | data->'name' | JSON |
#> text[] | 获取键路径 a,b (例如, data.a.b) | data#>'{a,b}' | JSON |
->> int | 获取数组元素 2 | data->>2 | 文本 |
->> text | 获取对象键 name | data->>'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'];
| 运算符 | 示例 | 说明 |
|---|---|---|
|| json | data || array['a','b'] | 连接 |
- str | data - 'a' | 删除键 |
- int | data - 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'