使用列值作为对象键创建json

使用列值作为对象键创建json,json,postgresql,postgresql-9.3,Json,Postgresql,Postgresql 9.3,我有一个定义如下的表: CREATE TABLE data_table AS ( id bigserial, "name" text NOT NULL, "value" text NOT NULL, CONSTRAINT data_table_pk PRIMARY KEY (id) ); INSERT INTO data_table ("name", "value") VALUES ('key_1', 'value_1'), ('key_2', 'value_2'); {

我有一个定义如下的表:

CREATE TABLE data_table AS (
  id bigserial,
  "name" text NOT NULL,
  "value" text NOT NULL,
  CONSTRAINT data_table_pk PRIMARY KEY (id)
);

INSERT INTO data_table ("name", "value") VALUES
('key_1', 'value_1'),
('key_2', 'value_2');
{
  "key_1":"value_1",
  "key_2":"value_2"
}
我想从这个表内容中获取一个JSON对象,如下所示:

CREATE TABLE data_table AS (
  id bigserial,
  "name" text NOT NULL,
  "value" text NOT NULL,
  CONSTRAINT data_table_pk PRIMARY KEY (id)
);

INSERT INTO data_table ("name", "value") VALUES
('key_1', 'value_1'),
('key_2', 'value_2');
{
  "key_1":"value_1",
  "key_2":"value_2"
}

现在,我使用客户端应用程序将结果集解析为JSON格式。是否可以通过postgresl查询完成此操作?

如果您使用的是9.4,则可以执行以下操作:

select
    format(
        '{%s}',
        string_agg(format(
            '%s:%s',
            to_json("name"),
            to_json("value")
        ), ',')
    )::json as json_object
from data_table;
          json_object              
---------------------------------------
 {"key_1":"value_1","key_2":"value_2"}
$ select json_object_agg("name", "value") from data_table;
           json_object_agg
----------------------------------------------
{ "key_1" : "value_1", "key_2" : "value_2" }

在一般情况下,可以在子查询的顶部嵌套多个json_object_agg函数。内部子查询应该始终至少有一列将被外部子查询用作json_object_agg函数的键

在本例中,在子查询C中,列操作的值用作子查询A中的键。在A中,列角色的值用作查询A中的键

-询问 从中选择json\u object\u aggq1.role、q1.actions -子查询B 从中选择q2.role、json\u object\u aggq2.action、q2.permissions作为操作 -子查询C 选择r.name作为角色,a.name作为操作,json\u构建\u对象 “已启用”,coalesca.bit&bit_和p.actionids 0,false, 'guestUnsupported',r.name='guest'和a.guestUnsupported 作为权限 来自角色r a.entity='route'上的左连接操作a p.roleid=r.id上的左连接权限p a.entity=p.entityname 并且p.entityid=1或p.entityid为空 哪里 1 = 1 和r.enabled 并且r.deleted为空 按r.name、a.id分组 按q2分组。角色 作为q1 结果是具有以下内容的单行/单列:

{ 角色1:{ APIPUT:{ 启用:false, 不支持的错误:false }, 删除:{ 启用:false, 不支持的错误:false }, APIGET:{ 启用:对, 不支持的错误:false }, APIPOST:{ 启用:对, 不支持的错误:false } }, 作用2:{ APIPUT:{ 启用:false, 不支持的错误:false }, 删除:{ 启用:false, 不支持的错误:false }, APIGET:{ 启用:对, 不支持的错误:false }, APIPOST:{ 启用:false, 不支持的错误:false } } }
我必须亲自将“%s:%s”更改为“%s:%s”,才能使其正常工作。但它是有效的。谢谢似乎这真的应该包括在这一页上:但是他们在这一页上包含了一个关于它的小注释:在11.4中运行得很好。简洁完美