产品提了个需求,要给用户的某些操作设置一些默认值,我不想机械添加新增字段,我只是需要一个配置而已,需要的时候读出来,就跟文件配置一样。读写文件毕竟又是个力气活,还存在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 ~