【问题标题】:Concatenating JSON results to single column postgresql将 JSON 结果连接到单列 postgresql
【发布时间】:2014-05-22 16:42:06
【问题描述】:

所以,目前我在一个表中有两列,其中一列包含一个 JSON 文档,如下所示:

        CID:
        2
        Name:
        {"first" : "bob","1" : "william", "2" : "archebuster", "last" : "smith"}    

当我使用以下方法搜索此列时:

  SELECT "CID", "Name"->>(json_object_keys("Name")) AS name FROM "Clients" WHERE 
  "Name"->>'first' LIKE 'bob' GROUP BY "CID";

我明白了:

  CID | name
--------------
  2   | bob
  2   | william
  2   | archebuster
  2   | smith

当我真的想要时:

 CID | name
  2  | bob william archebuster smith

我该怎么做呢?我是 postgresql 中 JSON 的新手。 我已经尝试过 string_agg 并且它不起作用,大概是因为我在 json 列中工作,尽管事实上 '->>' 应该将结果类型设置为字符串

更新:

【问题讨论】:

  • 不确定试试array_agg("Name"->>(json_object_keys("Name"))) AS name
  • 对于数组 agg 我得到“在不能接受集合的上下文中调用的集合值函数”。对于字符串 agg 我得到“错误:string_agg(text) 不存在”
  • 在临时表中插入这些值并在其上使用 array_agg。
  • 不完全确定如何做到这一点,一直在尝试将事物转换为数组,但遇到了同样的问题,其中每一行都是 {bob} {william} 等

标签: sql json postgresql postgresql-json


【解决方案1】:

首先,您需要了解,如果您在SELECT 子句中包含一个集合返回函数,您将创建一个隐式LATERAL CROSS JOIN

您的查询实际上是这样的:

SELECT "CID", "Name"->>"key" AS name
FROM "Clients"
CROSS JOIN LATERAL json_object_keys("Name") AS "foo"("key")
WHERE "Name"->>'first' LIKE 'bob'
GROUP BY "CID", "Name"->>"key"

如果您真的想这样做,可以在此处应用聚合函数(可能是 array_aggstring_agg)。

SQLFiddle

【讨论】:

  • 感谢您的解释。但是,聚合函数对此不起作用。它使数据库抱怨“在不能接受集合的上下文中调用集合值函数调用”
  • @user3512424 你错了,聚合函数将适用于这个翻译后的例子。即array_agg("Name"->>"key") AS names。您的查询是在 SELECT 子句中不使用集合返回函数的完美示例,除非您确切知道自己在做什么。
  • 我不认为我是。查看结果:imgur.com/8S4JAqq 哦,等一下,我明白你现在在说什么.. 会再试一次
猜你喜欢
  • 2014-10-17
  • 2018-07-08
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多