【问题标题】:PostgreSQL group_concat rows as jsonPostgreSQL group_concat 行作为 json
【发布时间】:2019-12-24 08:05:48
【问题描述】:

我在mysql 有一个查询,想在PostgreSql 中做同样的事情。

这是查询:

-- mysql
SELECT cat.id, cat.category,
CONCAT('[',
      GROUP_CONCAT(CONCAT('{"rate":"',mod.rate,'", "model_name":"', mod.modelName, '", "capacity":"',mod.capacity,'"}')), ']') vehicles 
      FROM categories cat 
      LEFT JOIN models mod 
      ON cat.id = mod.category_id 
      GROUP BY cat.id

这将得到如下输出:

id  |  category  |  vehicles
__________________________________________________________________________
1   |  2-wheeler |  [ { "rate": "400", "model_name": "Pulsar 12", ... }, {...} ]
2   |  4-wheeler |  [ { "rate": "800", "model_name": "Honda 12", ... }, {...} ]

我正在尝试与PostgreSql 相同。

这就是我卡住的地方:

-- postgres
SELECT cat.id, cat.category,
CONCAT('[',
      array_to_string(CONCAT('{"rate":"',mod.rate,'", "model_name":"', mod.modelName, '", "capacity":"',mod.capacity,'"}')), ']') vehicles 
      FROM categories cat 
      LEFT JOIN models mod 
      ON cat.id = mod.category_id 
      GROUP BY cat.id

我不知道该怎么做。

还有表格:

型号:

id  |  modelName   |  rate  |  category_id
_____________________________________________
1   |  Pulsar - 12 |  400   |  1
2   |  Honda       |  800   |  2

分类:

id  | category
__________________
1   | 2-wheeler
2   | 4-wheeler

【问题讨论】:

  • 我猜你正在寻找 string_agg 聚合函数。

标签: sql postgresql group-concat array-agg


【解决方案1】:

您必须使用 JSON_BUILD_OBJECT 构建单个 JSON 对象,然后使用 JSON_AGG 构建这些对象的数组:

SELECT cat.id, cat.category,
(SELECT json_agg(
  json_build_object(
    'rate',mod.rate,
    'model_name', mod.modelName, 
    'capacity',mod.capacity
  )) AS vehicles 
  FROM models AS mod WHERE category_id = cat.id
) AS models
FROM categories AS cat 

【讨论】:

    【解决方案2】:

    您可以使用内置的 PostgreSQL 函数来构建 JSON 对象。

    select cat.id, cat.category, json_agg(row_to_json(row(mod.rate, mod.modelName))) vehicles from categories cat
    left join models mod on cat.id = mod.category_id
    group by cat.id, cat.category;
    

    结果是

        id  category    vehicles
    1   1   2-wheeler   [{"f1":400,"f2":"Pulsar - 12"}]
    2   2   4-wheeler   [{"f1":800,"f2":"Honda"}]
    

    【讨论】:

      猜你喜欢
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多