從PostgreSQL 9.3開始,json就成了postgres里的一種數據類型,也就是和varchar、int一樣,我們表里的一個字段的類型可以為json了。
與此同時,postgres還提供了jsonb格式,jsonb格式是json的二進制形式,二者的區別在於json寫入快,讀取慢,jsonb寫入慢,讀取快,但在操作上,二者是沒有區別的。下面以jsonb為例。
創建表
假設我們要存儲的json數據是這樣的:
{
"id": ID
"name":"名字", "age":年齡 }
建表語句如下:
-
create table if not exists name_age (
-
info jsonb
-
)
好了,這樣就創建了一張表,里面只有一個 info
字段,下面開始進行CRUD操作。
插入數據
插入數據可以直接以json格式插入:
insert into name_age values('{"id":1,"name":"小明", "age":18}')
在json里插入新的key值gender,如下:
SELECT info||'{"gender":"男"}'::jsonb from name_age where (info->>'id')::int4 = 1
查詢數據
Postgres里的查詢需要用到查詢符。比如說,我們要查詢id為1的數據,語句如下:
select info from name_age where info @> '{"id":1}'::jsonb
用到了 @>
這個查詢符,表明info當前這條記錄里的頂層json中有沒有id為1的key-value對;有的話則滿足條件。
再來一個復雜一點的查詢的,查詢 age>16
的記錄,並且只顯示 name
,語句如下:
select info->'name' from name_age where (info->>'age')::int4 > 16
關於詳細運算符使用,請參考官方文檔: 9.15. JSON Functions and Operators
修改數據
下面,將 age
從 18
改為 22
,SQL語句:
SELECT info ||'{"age":22}'::jsonb from name_age where (info->>'id')::int4 = 1
上述用法僅適用於9.5以上,9.5以下需要整個記錄更新,不可以單獨修改某個值。
除了操作符以外,還可以使用函數操作: jsonb_set()
,函數簽名如下:
jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])
詳細使用可參考 9.15. JSON Functions and Operators
刪除數據
刪除age這個key,SQL如下:
SELECT info-'age' from name_age where (info->>'id')::int4 = 1
直接用操作符 -
即可。
總結
PostgreSQL 9.5以上的版本中有了很多方便的操作符,使得操作json變得非常方便了。