如何返回对象的自定义数组并联接其他一些表?

用户名

我在jsonb上问了太多问题,但仍然感到有些迷茫。我有以下表格:

CREATE TABLE _data (
  id       serial PRIMARY KEY
, data     jsonb
);

--with the following rows:
pk | data
---|------------------------
1  | {"year": 2012, "model": "honda"}
2  | {"year": 2014, "model": "toyota"}


CREATE TABLE _people (
  pk         serial PRIMARY KEY
  user       integer
, data       integer
, updated    timestamp without time zone
, documents  jsonb
);

-- with the following rows:
pk  | user   | data| updated                  | documents
----|--------|-----|--------------------------|---------------
1   | 1      | 1   | 2015-08-22 16:05:40.76   | [{"type": "spreadsheet", "title": "mySpreadsheet", "length": 1278, "ignoredKey": "ignoreme"}, {"type": "document", "title": "My Nice Title"}]
2   | 1      | 1   | 2015-08-24 16:03:00      | [{"type": "spreadsheet", "title": "anothersheet", "length": 1400, "ignoredKey": "ignoreme"}, {"type": "document", "title": "here's another document"}]



CREATE TABLE _users (
  pk       serial PRIMARY KEY
, name     text
);

-- with the following example row:

pk   | name
-----|------
1    | Jim Bob


I am trying to get the following output (notice I am ignoring some keys in my documents...specifically "ignoredKey":

User     | Data                             | Updated                   |Documents 
---------|----------------------------------|---------------------------|------------
Jim Bob  | {"year": 2012, "model": "honda"} |2015-08-22 16:05:40.764122 | [{"type": "spreadsheet", "title": "mySpreadsheet", "length": 1278}, {"type": "document", "title": "My Nice Title"}]

Jim Bob  | {"year": 2014, "model": "toyota"} |2015-08-24 16:03:00        | [{"type": "spreadsheet", "title": "anothersheet", "length": 1400}, {"type": "document", "title": "here's another document"}]

我有:

SELECT p.pk, u.name, custom_docs, d.data FROM _people p,
  jsonb_to_recordset(p.documents) doc(type text, title text, length numeric)
  LEFT JOIN _data d ON p.data = d.pk
  LEFT JOIN _users u ON p.user = u.pk

这给了我错误:

ERROR:  invalid reference to FROM-clause entry for table "p"
LINE 3:   LEFT JOIN _data d ON p.data = d.pk
                               ^
HINT:  There is an entry for table "p", but it cannot be referenced from this part of the query.

编辑#1:

如下所述,我需要创建“文档”列以将其作为对象数组...的形式为:

[{"type": "spreadsheet", "title": "mySpreadsheet", "length": 1278}, {"type": "document", "title": "My Nice Title"}]

一旦检索到其他任何格式都很难使用。

编辑#2:德米特里(Dmitry)的回答使我更进一步,但“文档”(Documents)列包含所有行中的所有文档,而不是我需要的那些:

WITH docs AS (
  SELECT array_agg(to_json(changed_structure)) as changed_json_array
  FROM _people p,jsonb_to_recordset(p.documents) AS changed_structure(type text, title text, length numeric)
)
SELECT u.name,d.data,p.updated,docs.changed_json_array FROM docs,_people p
LEFT JOIN _users u ON u.pk = p.user
LEFT JOIN _data d ON d.pk = p.data;

这给了我:

name    | data                              | updated                    | documents
------- | ----------------------------------| ---------------------------|
Jim Bob | {"year": 2012, "model": "honda"}  | 2015-08-22 16:05:40.764122 | {"{\"type\":\"spreadsheet\",\"title\":\"mySpreadsheet\",\"length\":1278}","{\"type\":\"document\",\"title\":\"My Nice Title\",\"length\":null}","{\"type\":\"spreadsheet\",\"title\":\"anothersheet\",\"length\":1400}","{\"type\":\"document\",\"title\":\"here's another document\",\"length\":null}"} 
Jim Bob | {"year": 2014, "model": "toyota"} | 2015-08-24-16:03:00        | {"{\"type\":\"spreadsheet\",\"title\":\"mySpreadsheet\",\"length\":1278}","{\"type\":\"document\",\"title\":\"My Nice Title\",\"length\":null}","{\"type\":\"spreadsheet\",\"title\":\"anothersheet\",\"length\":1400}","{\"type\":\"document\",\"title\":\"here's another document\",\"length\":null}"}
克林

这里的关键动机是使用json_agg(to_json(doc))来自jsonb_to_recordset(p.documents)

select pk, json_agg(to_json(doc)) doc
from _people p, jsonb_to_recordset(p.documents) doc(type text, title text, length numeric)
group by 1

 pk |                                                                doc                                                
----+-----------------------------------------------------------------------------------------------------------------------------------
  1 | [{"type":"spreadsheet","title":"mySpreadsheet","length":1278}, {"type":"document","title":"My Nice Title","length":null}]
  2 | [{"type":"spreadsheet","title":"anothersheet","length":1400}, {"type":"document","title":"heres another document","length":null}]
(2 rows)        

并适当使用联接:

select u.name, d.data, p.updated, s.doc
from _people p
left join _users u on u.pk = p.auser
left join _data d on d.pk = p.data
left join (
    select pk, json_agg(to_json(doc)) doc
    from _people p, jsonb_to_recordset(p.documents) doc(type text, title text, length numeric)
    group by 1
    ) s on s.pk = p.pk

  name   |               data               |        updated         |                                                                doc
---------+----------------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------------------
 Jim Bob | {"year": 2012, "model": "honda"} | 2015-08-22 16:05:40.76 | [{"type":"spreadsheet","title":"mySpreadsheet","length":1278}, {"type":"document","title":"My Nice Title","length":null}]
 Jim Bob | {"year": 2012, "model": "honda"} | 2015-08-24 16:03:00    | [{"type":"spreadsheet","title":"anothersheet","length":1400}, {"type":"document","title":"heres another document","length":null}]
(2 rows)        

注意:我必须更改_users.user_users.auser

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Malloc 自定义类型和其他一些 C 问题

来自分类Dev

ubuntu kde终端字体将光标和其他一些字符替换为自定义字体

来自分类Dev

需要创建需要其他一些AMD模块的UI5自定义控件

来自分类Dev

自定义 __getattr__ 返回其他对象属性

来自分类Dev

如何编写某些对象的条件查询不能在对象数组中,而其他一些对象之一必须在对象数组中?

来自分类Dev

oracle to_date在自定义查询中返回一些错误

来自分类Dev

scala。一些不能强制转换为自定义对象

来自分类Dev

关于自定义数组的一些主要知识缺乏

来自分类Dev

通过脚本克隆创建一些自定义的 SQL 表

来自分类Dev

自定义ExtJS CSS-一些困难

来自分类Dev

如何联接表并过滤一些行?

来自分类Dev

如何在我的LocalizedStringKey中添加一些自定义文本?

来自分类Dev

如何在Symfony 5中验证一些自定义约束

来自分类Dev

如何使用自定义功能在组织模式下仅删除一些标签

来自分类Dev

我们如何在 UWP Mapcontrol 中放置一些自定义按钮?

来自分类Dev

如何执行一些自定义 bash 脚本命令?

来自分类Dev

我如何用其他一些文字打印json对象

来自分类Dev

比较相同数组的对象,并在特定属性与其他对象匹配时将其一些属性分组

来自分类Dev

SQL联接一些表

来自分类Dev

SQL联接一些表

来自分类Dev

如何从EF DbUpdateException获取一些其他信息

来自分类Dev

在自定义数组中设置一些WooCommerce订单和订单项目数据

来自分类Dev

如何在Spring中使用List <Entity>以外的其他属性返回自定义响应

来自分类Dev

其他一些条件

来自分类Dev

如何在SQLite中定义一些表

来自分类Dev

如何为每个CRM 2011网格功能区添加一些自定义功能?

来自分类Dev

如何将一些信息传递给Sitecore Webforms for Marketers自定义消息处理器管道?

来自分类Dev

如何自定义启动器图标并向要使用的用户的homedir添加一些文件?

来自分类Dev

VS 2013中的JavaScript IntelliSense列表用于自定义脚本TOO LONG。如何抑制一些物品?

Related 相关文章

  1. 1

    Malloc 自定义类型和其他一些 C 问题

  2. 2

    ubuntu kde终端字体将光标和其他一些字符替换为自定义字体

  3. 3

    需要创建需要其他一些AMD模块的UI5自定义控件

  4. 4

    自定义 __getattr__ 返回其他对象属性

  5. 5

    如何编写某些对象的条件查询不能在对象数组中,而其他一些对象之一必须在对象数组中?

  6. 6

    oracle to_date在自定义查询中返回一些错误

  7. 7

    scala。一些不能强制转换为自定义对象

  8. 8

    关于自定义数组的一些主要知识缺乏

  9. 9

    通过脚本克隆创建一些自定义的 SQL 表

  10. 10

    自定义ExtJS CSS-一些困难

  11. 11

    如何联接表并过滤一些行?

  12. 12

    如何在我的LocalizedStringKey中添加一些自定义文本?

  13. 13

    如何在Symfony 5中验证一些自定义约束

  14. 14

    如何使用自定义功能在组织模式下仅删除一些标签

  15. 15

    我们如何在 UWP Mapcontrol 中放置一些自定义按钮?

  16. 16

    如何执行一些自定义 bash 脚本命令?

  17. 17

    我如何用其他一些文字打印json对象

  18. 18

    比较相同数组的对象,并在特定属性与其他对象匹配时将其一些属性分组

  19. 19

    SQL联接一些表

  20. 20

    SQL联接一些表

  21. 21

    如何从EF DbUpdateException获取一些其他信息

  22. 22

    在自定义数组中设置一些WooCommerce订单和订单项目数据

  23. 23

    如何在Spring中使用List <Entity>以外的其他属性返回自定义响应

  24. 24

    其他一些条件

  25. 25

    如何在SQLite中定义一些表

  26. 26

    如何为每个CRM 2011网格功能区添加一些自定义功能?

  27. 27

    如何将一些信息传递给Sitecore Webforms for Marketers自定义消息处理器管道?

  28. 28

    如何自定义启动器图标并向要使用的用户的homedir添加一些文件?

  29. 29

    VS 2013中的JavaScript IntelliSense列表用于自定义脚本TOO LONG。如何抑制一些物品?

热门标签

归档