【pgsql使用记录】json类型字段

        产品提了个需求,要给用户的某些操作设置一些默认值,我不想机械添加新增字段,我只是需要一个配置而已,需要的时候读出来,就跟文件配置一样。读写文件毕竟又是个力气活,还存在IO问题。要是数据库能直接存json就好了。经查,发现pgsql早就支持json类型的数据了,不管怎样,我还是要为此给pgsql点32个赞!!

于是定义新字段

 ALTER TABLE user ADD COLUMN extra_config json; 

做一些测试:

插入一个数组数据

INSERT INTO user (id, extra_config) VALUES(1, '{"name":"张三","age":18,"birthday":"2013-03-03"}')

INSERT INTO user (id, extra_config) VALUES(2, '{"name":"李四","age":17,"birthday":"2014-03-15"}')

完成之后,我要检索名字为"张三"的用户

SELECT id,extra_config::json->'name' as name FROM user WHERE (extra_config::json->'name')::text = '张三'

这样,就可以了。

另外,在展示一个少复杂的例子:


select (a::json->'name')::text,a::json->'name', * from json_array_elements('[{"name":"李四","age":17,"birthday":"2014-03-15"},{"name":"王武","age":27,"birthday":"2013-03-15"}]') as a

where (a::json->'name')::text LIKE '%李四%';

上述结果,请注意返回的字段类型。其中::text返回字符串,::json返回json

其中,where 条件里的结果实际上是 双引号引起来的 "李四",所以直接用=比较是不可能得到结果的。我想要直接得到具体字段值可以试用 #>> 注意:两个尖括号!

再来复杂点:

select a::json#>'{person,name}' as name_json,(a::json#>'{person,name}')::text as name_txt,(a::json#>>'{person,name}')::text as name_textval_only,* from json_array_elements('[{"person":{"name":"李四","age":17,"birthday":"2014-03-15"}},{"person":{"name":"王武","age":27,"birthday":"2013-03-15"}}]') as a

where (a::json#>>'{person,name}')::text = '李四';

这次json有更多的嵌套,于是需要路径的支持了,仔细观察#>>之后的路径选择语法'{person,name}',谁用谁知道!

have fun ~

你可能感兴趣的:(PostgreSQL,json数据类型及操作符函数等)