【问题标题】:Postgres/JSON - translate parent child relation to a jsonPostgres/JSON - 将父子关系转换为 json
【发布时间】:2012-08-07 03:49:34
【问题描述】:

我在 postgres 数据库中有以下记录。 parent_pk 与父子关系中的 pk 相关。

pk 名称类型 parent_pk --- ---- ---- --------- 1 hnumber101 房子 0 2 hnumber201 房子 0 101 dodge_charger 车辆 1 102野马车1 103 民用车 2 301约翰用户101 302 爱德华用户 102 303 约翰用户 102 304 约翰用户 103 我想从上面生成一个json,格式如下- [ { “身份证”:1, “名称”:“hnumber101”, “类型”:“房子” “孩子”: [ { “身份证”:101, "name": "道奇充电器", “类型”:“车辆” “孩子”: [{ “身份证”:301, “姓名”:“约翰”, “类型”:“用户” }], }, { “身份证”:102, “名称”:“野马”, “类型”:“车辆” “孩子”: [{ “身份证”:303, “姓名”:“约翰”, “类型”:“用户” }, { “身份证”:302, “姓名”:“爱德华”, “类型”:“用户” }], }], }, { “身份证”:2, “名称”:“hnumber201”, “类型”:“房子” “孩子”: [ { “身份证”:103, “名称”:“公民”, “类型”:“车辆” “孩子”: [{ “身份证”:304, “姓名”:“约翰”, “类型”:“用户” }], }], }]

我曾尝试使用 WITH RECURSIVE 查询,但这会产生条目列表,然后我必须在我的 java 代码中进行大量循环/散列映射,才能在父级中获取该子块。 最有效的方法是什么?

【问题讨论】:

  • 9.2 对 JSON 的支持非常有限。 row_to_json 构造函数不支持匿名行,没有 scalar_to_jsonjson_escape 将单个值包装为 JSON,并且没有聚合或合并/附加函数。这使得构建不对应于行类型的值非常困难:-(
  • 您是否有将 JSON 文件加载到数据库表中并保留 ID 和 parentID 的代码?

标签: java json postgresql recursive-query self-join


【解决方案1】:

类似的东西:

SELECT things.pk, things.name, things.type, array_agg(sub.pk) AS children
FROM things
LEFT JOIN things sub ON sub.parent_pk = things.pk
GROUP BY things.pk, things.name, things.type;
PK |姓名 |类型 |孩子们 -----+----------------+---------+----------- 1 | hnumber101 |房子| {102,101} 101 |道奇充电器 |车辆 | {301} 102 |野马 |车辆 | {303,302} 301 |约翰 |用户 | {空值} 302 |爱德华 |用户 | {空值} 303 |约翰 |用户 | {空值}

将行收集到由 pk Map<Integer, Thing> 键入的 Map 中。

class Thing {
  Integer id;
  String name;
  String type;
  Integer[] children;

  public String printMe(Map<Integer, Thing> allThings) {
    String ret = "... format json stuff here";
    for(Integer childId in children) {
      Thing child = allThings.get(childId);
      ret += child.printMe(allThings);
    }
    ret += "Format json stuff here";
    return ret;
  } 
};

【讨论】:

  • 是的。如果您希望它们作为 JSON 直接从数据库中取出,您必须 CREATE TYPE 一个新的行类型,如 CREATE TYPE blah(id integer,name text,type text,children int[]),然后将上述查询包装在 RETURNS SETOF blah 的 SQL 函数中。然后您可以select row_to_json(x) FROM the_function() AS xSELECT array_to_json(array_agg(x)) from the_function() as x。与 XML 或 hstore 支持相比,这是一个痛苦的迂回,因为 json 还没有任何有用的聚合或运算符。
  • 效果很好。我喜欢这个查询,这让事情变得更加简单。我有另一个问题。是否可以为具有父 ID 的用户填充“空”子代?所以对于用户来说,孩子是父母的名单。这就像询问约翰在那所房子里开什么车?只是想想想是否有可能在一个查询中获取所有信息。
  • @jkj:我也有类似的需求,我怎么能在Oracle中写SQL。
  • @Harpreet:我在stackoverflow.com/questions/16364413/…. 下也有类似的问题。现在我的 SQL 输出与您的相同。但我不确定如何在 JSON 字符串中创建父子结构。我认为你正在这样做。如果你能告诉我你是如何用 Java 做的,我将不胜感激。
  • 它可以处理嵌套的 Childs。换句话说如果child包含child,它如何处理
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多