繁体   English   中英

如何轻松地将外部连接的 SQL 表转换为 json 对象?

[英]How can I easily convert an outer joined SQL table to a json object?

我正在使用 nodejs 和 oracledb,我能够将一个简单的查询转换为一个 json 文件。

我想做的是将我的 oracle 查询的结果转换为 json 对象。 问题变成了我的加入

例如,假设我有一个用户表,其中包含名称和 ID。 我还有一个网络登录表,每个都包含一个用户 ID。 我想做的是为每个用户创建一个 json,其中包含他们的姓名、ID 和他们的网络登录列表。

通过外连接,我得到了所有相关数据,但是每个 id/name 都是重复的,所以我得到了每个用户的几个 json 条目。

我没有你的表也没有数据,所以 - 这是一个基于 Scott 的示例模式及其部门和员工表的示例:

SQL> select d.dname, d.loc, e.ename, e.job, e.sal
  2  from dept d join emp e on e.deptno = d.deptno
  3  order by d.dname;

DNAME          LOC           ENAME      JOB              SAL
-------------- ------------- ---------- --------- ----------
ACCOUNTING     NEW YORK      MILLER     CLERK         1300.1
ACCOUNTING     NEW YORK      KING       PRESIDENT       5000
ACCOUNTING     NEW YORK      CLARK      MANAGER         2450
RESEARCH       DALLAS        ADAMS      CLERK         1100.1
RESEARCH       DALLAS        FORD       ANALYST         3000
RESEARCH       DALLAS        JONES      MANAGER         2975
RESEARCH       DALLAS        SMITH      CLERK          800.1
RESEARCH       DALLAS        SCOTT      ANALYST         3000
SALES          CHICAGO       WARD       SALESMAN      1250.1
SALES          CHICAGO       TURNER     SALESMAN      1500.1
SALES          CHICAGO       ALLEN      SALESMAN      1600.1
SALES          CHICAGO       JAMES      CLERK          950.1
SALES          CHICAGO       BLAKE      MANAGER         2850
SALES          CHICAGO       MARTIN     SALESMAN      1250.1

14 rows selected.

SQL>

如果我理解正确,您希望将部门作为“主”数据,将在该部门工作的员工作为其“详细信息”。 如果是这样,请使用json_arrayagg

SQL> select
  2    json_object ('OBJ' value json_object
  3                    ('DEPARTMENT' value json_object
  4                        ('NAME' value d.dname,
  5                         'LOCATION'   value d.loc
  6                        )
  7                    ),
  8                  'EMPS' value json_arrayagg
  9                    (json_object ('NAME'   value e.ename,
 10                                  'JOB'    value e.job,
 11                                  'SALARY' value e.sal
 12                                 )
 13                    )
 14                ) obj
 15  from dept d join emp e on e.deptno = d.deptno
 16  group by d.dname, d.loc;

结果:

OBJ
--------------------------------------------------------------------------------
{"OBJ":{"DEPARTMENT":{"NAME":"SALES","LOCATION":"CHICAGO"}},"EMPS":[{"NAME":"WAR
D","JOB":"SALESMAN","SALARY":1250.1},{"NAME":"MARTIN","JOB":"SALESMAN","SALARY":
1250.1},{"NAME":"BLAKE","JOB":"MANAGER","SALARY":2850},{"NAME":"JAMES","JOB":"CL
ERK","SALARY":950.1},{"NAME":"ALLEN","JOB":"SALESMAN","SALARY":1600.1},{"NAME":"
TURNER","JOB":"SALESMAN","SALARY":1500.1}]}

{"OBJ":{"DEPARTMENT":{"NAME":"RESEARCH","LOCATION":"DALLAS"}},"EMPS":[{"NAME":"J
ONES","JOB":"MANAGER","SALARY":2975},{"NAME":"SCOTT","JOB":"ANALYST","SALARY":30
00},{"NAME":"SMITH","JOB":"CLERK","SALARY":800.1},{"NAME":"ADAMS","JOB":"CLERK",
"SALARY":1100.1},{"NAME":"FORD","JOB":"ANALYST","SALARY":3000}]}

{"OBJ":{"DEPARTMENT":{"NAME":"ACCOUNTING","LOCATION":"NEW YORK"}},"EMPS":[{"NAME
":"CLARK","JOB":"MANAGER","SALARY":2450},{"NAME":"MILLER","JOB":"CLERK","SALARY"
:1300.1},{"NAME":"KING","JOB":"PRESIDENT","SALARY":5000}]}


SQL>

如果您将其中任何一个复制/粘贴到例如JSON 格式化程序和验证程序中以检查它的真实外观以及它是否有效,您会得到

{
   "OBJ":{
      "DEPARTMENT":{
         "NAME":"SALES",
         "LOCATION":"CHICAGO"
      }
   },
   "EMPS":[
      {
         "NAME":"WARD",
         "JOB":"SALESMAN",
         "SALARY":1250.1
      },
      {
         "NAME":"MARTIN",
         "JOB":"SALESMAN",
         "SALARY":1250.1
      },
      {
         "NAME":"BLAKE",
         "JOB":"MANAGER",
         "SALARY":2850
      },
      {
         "NAME":"JAMES",
         "JOB":"CLERK",
         "SALARY":950.1
      },
      {
         "NAME":"ALLEN",
         "JOB":"SALESMAN",
         "SALARY":1600.1
      },
      {
         "NAME":"TURNER",
         "JOB":"SALESMAN",
         "SALARY":1500.1
      }
   ]
}

这是一个有效的 JSON。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM