在WEB应用或图展示的程序中通常使用Json格式传输,JavaScript Object Notation (JSON) 是一种轻量级的数据传输格式,在关系型数据库中通常存储的是表、列格式,如果数据库可以直接返回JSON, 那基于JSON传输的应用将会收益,JSON 是一种完全独立于语言的文本格式,使 JSON 成为理想的数据交换语言。 在PostGreSQL和ORACLE 12.2中都提供了JSON的SQL函数, Oracle Database 21c 中添加了原生 JSON 数据类型,这针对查询和 DML 处理进行了优化。加快处理 JSON 文档的速度。从 21c 开始,这是存储大型 JSON 文档的最佳类型。Oracle Database 19c 引入了一个新选项:使用 JSON_mergepatch 进行 JSON 修补。这仅替换了文档的相关部分,Oracle Database 21c提供了一种更好的方法:JSON_transform。Oracle Database 21c提供了一种更好的方法:JSON_transform,JSON_transform 具有强大的 JSON 操作功能,允许您添加、删除和更改文档中的值,与JSON_mergepatch 不同,您可以针对要更改的特定属性。 下面记录一下PostgreSQL和Oracle返回Json的方法。
PostGreSQL
sdbo=# select version(); version ------------------------------------------------------------ PostgreSQL 13.1, compiled by Visual C++ build 1914, 64-bit sdbo=# \d 关联列表 架构模式 | 名称 | 类型 | 拥有者 ----------+-----------------+--------+-------- public | sdbo_department | 数据表 | weejar (1 行记录) sdbo=# select * from sdbo_department; dep_id | dep_name --------+---------- 1 | mgr (1 行记录) sdbo=# insert into sdbo_department values (2,'dev'); INSERT 0 1 sdbo=# select row_to_json(sdbo_department) from sdbo_department; row_to_json ------------------------------- {"dep_id":1,"dep_name":"mgr"} {"dep_id":2,"dep_name":"dev"} (2 行记录) sdbo=# alter table sdbo_department add sex char(1); ALTER TABLE sdbo=# select row_to_json(sdbo_department) from sdbo_department; row_to_json ------------------------------------------ {"dep_id":1,"dep_name":"mgr","sex":null} {"dep_id":2,"dep_name":"dev","sex":null} (2 行记录) sdbo=# insert into sdbo_department values (3,'test',1); INSERT 0 1 sdbo=# select row_to_json(sdbo_department) from sdbo_department; row_to_json ------------------------------------------ {"dep_id":1,"dep_name":"mgr","sex":null} {"dep_id":2,"dep_name":"dev","sex":null} {"dep_id":3,"dep_name":"test","sex":"1"} (3 行记录) sdbo=# select row_to_json(row(dep_id,dep_name)) from sdbo_department; row_to_json ---------------------- {"f1":1,"f2":"mgr"} {"f1":2,"f2":"dev"} {"f1":3,"f2":"test"} (3 行记录) sdbo=# select json_build_object('id',dep_id,'name',dep_name) from sdbo_department; json_build_object ----------------------------- {"id" : 1, "name" : "mgr"} {"id" : 2, "name" : "dev"} {"id" : 3, "name" : "test"} (3 行记录) sdbo=# insert into sdbo_department values (3,'test2',1); INSERT 0 1 sdbo=# select * from sdbo_department; dep_id | dep_name | sex --------+----------+----- 1 | mgr | 2 | dev | 3 | test | 1 3 | test2 | 1 (4 行记录) sdbo=# select json_agg(sdbo_department) from sdbo_department group by dep_id; json_agg --------------------------------------------- [{"dep_id":3,"dep_name":"test","sex":"1"}, + {"dep_id":3,"dep_name":"test2","sex":"1"}] [{"dep_id":2,"dep_name":"dev","sex":null}] [{"dep_id":1,"dep_name":"mgr","sex":null}] (3 行记录) sdbo=# select json_agg(dep_name) from sdbo_department group by dep_id; json_agg ------------------- ["test", "test2"] ["dev"] ["mgr"] (3 行记录) sdbo=# select dep_id,json_agg(dep_name) from sdbo_department group by dep_id; dep_id | json_agg --------+------------------- 3 | ["test", "test2"] 2 | ["dev"] 1 | ["mgr"] (3 行记录)ORACLE
SQL> @cc pdb1 ALTER SESSION SET container = pdb1; Session altered. USERNAME INST_NAME HOST_NAME I# SID SERIAL# VERSION STARTED SPID OPID CPID SADDR PADDR -------------------- -------------------- ------------------------- --- ----- -------- ---------- -------- ---------- ----- --------------- ---------------- ---------------- SYS PDB1-anbob19c oel7db1 1 1 17152 19.0.0.0.0 20210922 2031 33 1938 0000000078881028 00000000794F7F48 SQL> create table anbob.emp(emp_id int,emp_name varchar2(100)); Table created. SQL> insert into anbob.emp values (1,'a'); 1 row created. SQL> insert into anbob.emp values (2,'b'); 1 row created. SQL> insert into anbob.emp values (3,'c'); 1 row created. SQL> select json_object(*) from anbob.emp; JSON_OBJECT(*) -------------------------------- {"EMP_ID":1,"EMP_NAME":"a"} {"EMP_ID":2,"EMP_NAME":"b"} {"EMP_ID":3,"EMP_NAME":"c"} SQL> alter table anbob.emp add sex char(1); Table altered. SQL> insert into anbob.emp values (3,'d',1); 1 row creted. SQL> select * from anbob.emp; EMP_ID EMP_NAME S ---------- -------------------- - 1 a 2 b 3 c 3 d 1 SQL> select json_object(*) j from anbob.emp; J ---------------------------------------- {"EMP_ID":1,"EMP_NAME":"a","SEX":null} {"EMP_ID":2,"EMP_NAME":"b","SEX":null} {"EMP_ID":3,"EMP_NAME":"c","SEX":null} {"EMP_ID":3,"EMP_NAME":"d","SEX":"1"} SQL> select json_object(key 'eno' value emp_id, key 'ename' value emp_name) from anbob.emp; JSON_OBJECT(KEY'ENO'VALUEEMP_ID,KEY'ENAME'VALUEEMP_NAME) ---------------------------------------------------- {"eno":1,"ename":"a"} {"eno":2,"ename":"b"} {"eno":3,"ename":"c"} {"eno":3,"ename":"d"} SQL> select json_array(emp_id,emp_name) from anbob.emp; JSON_ARRAY(EMP_ID,EMP_NAME) ------------------------------------------ [1,"a"] [2,"b"] [3,"c"] [3,"d"] SQL> select json_arrayagg(emp_name) from anbob.emp; JSON_ARRAYAGG(EMP_NAME) ------------------------------------- ["a","b","c","d"] SQL> select json_arrayagg(json_object(key 'eno' value emp_id, key 'ename' value emp_name)) from anbob.emp; JSON_ARRAYAGG(JSON_OBJECT(KEY'ENO'VALUEEMP_ID,KEY'ENAME'VALUEEMP_NAME)) --------------------------------------------------------------------------------------------- [{"eno":1,"ename":"a"},{"eno":2,"ename":"b"},{"eno":3,"ename":"c"},{"eno":3,"ename":"d"}] SQL> select json_object( 'eno' value emp_id, 'enames' value json_arrayagg(e.emp_name), 'cnt' value (select count(*) from anbob.emp e1 where e1.emp_id=e.emp_id) ) from anbob.emp e join anbob.dept d on e.emp_id=d.id group by e.emp_id; JSON_OBJECT('ENO'VALUEEMP_ID,'ENAMES'VALUEJSON_ARRAYAGG(E.EMP_NAME),'CNT'VALUE(SELECTCOUNT(*)FROMANBOB.EMPE1WHEREE1.EMP_ID=E.EMP_ID)) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ {"eno":1,"enames":["a"],"cnt":1} {"eno":3,"enames":["c","d"],"cnt":2}