在 PostgreSQL 9.2 版本中已经支持 JSON 类型,不过支持的操作非常有限,仅支持以下函数
 
array_to_json(anyarray [, pretty_bool])
row_to_json(record [, pretty_bool])
 
        如果想扩充 JSON 其它函数,得另外安装一些外部模块,好在 9.3 版本 JSON 增加了多种函数
和操作符,这增强了 JSON 的功能,接下来演示下。
 
一 JSON 操作符介绍
--1.1 创建 json 表并插入数据
 francs=> create table test_json1 (id serial primary key,name json);

CREATE TABLE
 
francs=> insert into test_json1 (name) values ('{"col1":1,"col2":"francs","col3":"male"}');
INSERT 0 1
francs=> insert into test_json1 (name) values ('{"col1":2,"col2":"fp","col3":"female"}');
INSERT 0 1
 
francs=> select * From test_json1;
 id |                   name                   
----+------------------------------------------
  1 | {"col1":1,"col2":"francs","col3":"male"}
  2 | {"col1":2,"col2":"fp","col3":"female"}
(2 rows)
 
francs=> create table test_1 (id int4,name varchar(32),flag char(1));
CREATE TABLE
 
francs=> insert into test_1 values (1,'a','f');
INSERT 0 1
francs=> insert into test_1 values (2,'b','f');
INSERT 0 1
francs=> insert into test_1 values (3,'c','t');
INSERT 0 1
 
francs=> select * from test_1;
 id | name | flag 
----+------+------
  1 | a    | f
  2 | b    | f
  3 | c    | t
(3 rows)

备注:创建两张测试表,其中第一张为 json 表。

 
--1.2 操作符 -> 介绍
 
          操作符 ->  可以返回 json 类型的字段值,例如:
 francs=> select id ,name ->'col1' col1, name -> 'col2' col2, name -> 'col3' col3 from test_json1 where id=1;

 id | col1 |   col2   |  col3  
----+------+----------+--------
  1 | 1    | "francs" | "male"
(1 row)
 
--1.3 操作符 ->> 介绍
 
        操作符 ->> 与之前的 -> 类似,只不过返回的是 text 类型,例如:
 francs=> select id ,name ->>'col1' col1, name ->> 'col2' col2, name ->> 'col3' col3 from test_json1 where id=1;

 id | col1 |  col2  | col3 
----+------+--------+------
  1 | 1    | francs | male
(1 row)
 
以上2个例子说明了json数据可以被以表的形式显示出来,这对于query的查询很有帮助,因为现在的开发语言都不是直接支持json的,所以到前台之后需要读取转换,这样很麻烦,有了这个函数前台的query就
直接可以用了,PQ帮你做好了一切
这里例1的返回结果是类型不变的结果,这里有个问题就是"":"" text类型 会返回带冒号的结果,这样在实际中可能会困扰,但是可以保持数据的原始类型,
对于个人而言,我的数据基本都是text类型,实际用的时候在转换,为了统一,而PQ也给力方案例2中就是以text输出的,这样text类型的冒号("")就没有了
 
--1.4  操作符 #> 介绍
    
      操作符 #> 返回 json 数据字段指定的元素,如下:
 francs=> select '{"a":[1,2,3],"b":[4,5,6]}'::json#>'{b,1}';

 ?column? 
----------
 5
(1 row)
 
francs=> select '{"a":[1,2,3],"b":[4,5,6]}'::json#>'{a,2}';
 ?column? 
----------
 3
(1 row)
这里我说一个扩展,可能我自己比较笨所以反反复复实验了,说下另外的应用
如以上例子中的表1中 用以上函数就可以查询制定的值
 select id ,name #> '{col2}' from test_json1 where id=1;

?column? 
----------
"francs"
同理,返回的是源类型,自己琢磨了下,可以返回text类型
select id ,name #>> '{col2}' from test_json1 where id=1;
?column? 
----------
francs
 
哈哈,很神奇
 
二 JSON 函数介绍
--2.1 json_each(json) 函数
 francs=> select * from test_json1 where id=1;

 id |                   name                   
----+------------------------------------------
  1 | {"col1":1,"col2":"francs","col3":"male"}
(1 row)
 
francs=> select * from json_each((select name from test_json1 where id=1));
 key  |  value   
------+----------
 col1 | 1
 col2 | "francs"
 col3 | "male"
(3 rows)
 
francs=> select * from json_each('{"a":"foo", "b":"bar"}');
 key | value 
-----+-------
 a   | "foo"
 b   | "bar"
(2 rows)
这个函数就是返回原始数据类型为一个表,可以看到text类型有""号 
--2.2 json_each_text(json) 函数
 francs=> select * from json_each_text((select name from test_json1 where id=1));

 key  | value  
------+--------
 col1 | 1
 col2 | francs
 col3 | male
(3 rows)
这个不用说了,返回text类型
 
--2.3 row_to_json 函数
 francs=> select row_to_json(test_1) from test_1;

          row_to_json           
--------------------------------
 {"id":1,"name":"a","flag":"f"}
 {"id":2,"name":"b","flag":"f"}
 {"id":3,"name":"c","flag":"t"}
(3 rows)
 
francs=> select row_to_json(test_1) from test_1 where id=1;
          row_to_json           
--------------------------------
 {"id":1,"name":"a","flag":"f"}
(1 row)
这个原来我只会as的方式,没想到可以这样
 
备注:这个函数在 9.2 就有,将结果集转换成 json,这里也记录下。
 
 
三 聚合函数 json_agg(record)
 
    最后介绍新增加的聚合函数 array_agg(record),此函数用来将结果集转换成 JSON 数组。
 
--3.1 例1
 francs=> alter table test_json1 add grade int4 default '6';

ALTER TABLE
 
francs=> select * from test_json1;
 id |                   name                   | grade 
----+------------------------------------------+-------
  1 | {"col1":1,"col2":"francs","col3":"male"} |     6
  2 | {"col1":2,"col2":"fp","col3":"female"}   |     6
(2 rows)
 
francs=> select json_agg(name) from test_json1 group by grade;
                                      json_agg                                      
------------------------------------------------------------------------------------
 [{"col1":1,"col2":"francs","col3":"male"}, {"col1":2,"col2":"fp","col3":"female"}]
(1 row)   

备注:结果很明显。

 
--3.2 例2
 francs=> select * from test_1;

 id | name | flag 
----+------+------
  1 | a    | f
  2 | b    | f
  3 | c    | t
(3 rows)
 
francs=> select json_agg(a) from test_1 a;
             json_agg              
-----------------------------------
 [{"id":1,"name":"a","flag":"f"}, +
  {"id":2,"name":"b","flag":"f"}, +
  {"id":3,"name":"c","flag":"t"}]
(1 row)
聚合函数就更牛牛逼了,以前row_to_json的时候基本都是只能一串一串输出,在用代码拼接,这下好了,PQ帮你直接连接起来,而且保证了数据绝对的准确性,同样也可以结合上面的符号
select json_agg(a) #>>'{0,name}' from test_1 a;
 
备注:JSON 函数还是比较复杂的,更多内容请参考手册。

PostgreSQL9.3:JSON 功能增强 根据PQ中文论坛francs 给出的东西结合自己的摸索总结下的更多相关文章

  1. Java SE 5.0 - SE 8 的功能增强

    Table of Contents 前言 Java 5.0 Generics Enhanced for Loop Autoboxing Typesafe Enums Varargs Static Im ...

  2. MWeb 1.4 新功能介绍二:静态博客功能增强

    MWeb 比较有特色的是一键生成静态博客功能,然后从 MWeb 最开始规划要做静态博客生成功能时,我就希望 MWeb 的静态博客生成功能在易用的同时,还要有很强大的扩展性. 比如说能自己增加网站公告, ...

  3. VMare中安装“功能增强工具”,实现CentOS5.5与win7host共享文件夹的创建

    读者如要转载,请标明出处和作者名,谢谢. 地址01:http://space.itpub.net/25851087 地址02:http://www.cnblogs.com/zjrodger/ 地址03 ...

  4. JSON取值(key是中文或者数字)方式详解

    JSON取值(key是中文或者数字)方式详解 先准备一个json对象用于演示 var json = {'name':'zhangsan', '年龄':23, 404:'你可能迷路了'}; 使用JS中w ...

  5. Android 使用JSON格式与服务器交互 中文乱码问题解决

    当前是在开发Android 程序时,客户端与服务器端采用JSON传送数据,发现中文乱码问题.不过这个问题的解决办法应该对所有java语言开发的项目都使用. 解决方法是: 1.客户端发送数据之间加上: ...

  6. jquery-7 jquery中的文档处理方法有哪些(方法的参数表示功能增强)

    jquery-7 jquery中的文档处理方法有哪些(方法的参数表示功能增强) 一.总结 一句话总结:多看参考文档,多看主干目录.一般的功能分两个方法来实现,一个对应标签,一个对应标签和事情,比如克隆 ...

  7. Apache 后台服务器(主要处理php及一些功能请求 如:中文url)   Nginx 前端服务器(利用它占用系统资源少得优势来处理静态页面大量请求)   Lighttpd 图片服务器   总体来说,随着nginx功能得完善将使他成为今后web server得主流。

    Apache 后台服务器(主要处理php及一些功能请求 如:中文url) Nginx 前端服务器(利用它占用系统资源少得优势来处理静态页面大量请求) Lighttpd 图片服务器 总体来说,随着ngi ...

  8. fastjson在将Map<Integer, String>转换成JSON字符串时,出现中文乱码问题

    fastjson在将Map<Integer, String>转换成JSON字符串时,出现中文乱码问题. 先记下这个坑,改天在看看是怎么导致的,暂时通过避免使用Integer作为键(使用St ...

  9. DevExpress WPF v19.1:Data Grid/Tree List等控件功能增强

    行业领先的.NET界面控件DevExpress 日前正式发布v19.1版本,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WPF v19.1中新增的一些控件及部 ...

随机推荐

  1. 【翻译自mos文章】Clusterware间歇性的hang,命令报CRS-184而且Network Socket Files in /tmp/.oracle or /var/tmp/.oracle被删

    来源于: Clusterware Intermittently Hangs And Commands Fail With CRS-184 as Network Socker Files in /tmp ...

  2. IOC功能以及相关的配置

    功能: 控制反转,将对象的创建权反转给Spring可以解决程序耦合性高的问题,大概的意思就是将程序运行时所需要的资源.数据,全部让Spring供给,防止程序与程序之间联系过高,而出现耦合性高的问题. ...

  3. 【u002】数列排序(seqsort)

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 给定一个数列{an},这个数列满足ai≠aj(i≠j),现在要求你把这个数列从小到大排序,每次允许你交 ...

  4. Android SqlDelight具体解释和Demo样例

    一.简单介绍 SQLDelight 和 SqlBrite 是 Square 公司推出的一个 Android 平台数据库解决方式. 在了解这个两个东西前,必须先得有Andorid的Sqlite的知识(S ...

  5. JavaStuNote 4

    装箱(inbox)和拆箱(outbox) 代表了类类型和基本类型之间的转换行为. 手动版本号: Integer b = new Integer(10); Int a = b.intValue; 自己主 ...

  6. Javascript中的DOM实现显示鼠标的空间位置

    为了显示鼠标相对于浏览器的位置(相对于屏幕和页面类似),我们能够利用click事件,获得关于鼠标单击的事件对象event.这个事件对象里的clientX和clientY包括了鼠标的位置信息,所以我突发 ...

  7. amazeui中的js插件有哪些(详解功能)

    amazeui中的js插件有哪些(详解功能) 一.总结 一句话总结: 二.amazeui中的js插件有哪些 1.UI 增强 警告框Alert 按钮交互Button 折叠面板Collapse 下拉组件D ...

  8. Popup 解决位置不随窗口/元素FrameworkElement 移动更新的问题

    原文:Popup 解决位置不随窗口/元素FrameworkElement 移动更新的问题 Popup弹出后,因业务需求设置了StaysOpen=true后,移动窗口位置或者改变窗口大小,Popup的位 ...

  9. View的绘制顺序

    1.写在 super.onDraw() 的下面 把绘制代码写在 super.onDraw() 的下面,由于绘制代码会在原有内容绘制结束之后才执行,所以绘制内容就会盖住控件原来的内容. 2.写在 sup ...

  10. Starting MySQL.. ERROR! The server quit without updating PID file (/usr/local/mysql/data/vm10-0-0-19

    输入:service mysqld start 报错: Starting MySQL.. ERROR! The server quit without updating PID file (/usr/ ...