postgresql – 如何在postgresSQL中的jsonb值的array_agg中组合D
注意:我使用的是Postgres的最新版本(9.4)
我正在尝试编写一个查询,它通过第一个表的主键执行2个表和组的简单连接,并在第二个表中执行我想要作为对象返回的几个字段的array_agg.数组需要通过json对象中的2个字段的组合进行排序,并且也是未经过计算的. 到目前为止,我已经提出以下建议: SELECT zoo.id,ARRAY_AGG( DISTINCT ROW_TO_JSON(( SELECT x FROM ( SELECT animals.type,animals.name ) x ))::JSONB -- ORDER BY animals.type,animals.name ) FROM zoo JOIN animals ON animals.zooId = zoo.id GROUP BY zoo.id; 这导致每个动物园有一行,其中一个jsonb对象的聚合数组,每个动物一个,唯一. 但是,我似乎无法弄清楚如何通过代码注释掉的部分中的参数对其进行排序. 如果我拿出不同的,我可以ORDER BY原始字段,这很好,但后来我有重复. 解决方法
如果使用row_to_json(),除非输入一行键入,否则将丢失列名.如果你用json_build_object()使用显式名称“手动”构建jsonb对象,那么你会得到它们:
SELECT zoo.id,array_agg(za.jb) AS animals FROM zoo JOIN ( SELECT DISTINCT ON (zooId,"type","name") zooId,json_build_object('animal_type','animal_name',"name")::jsonb AS jb FROM animals ORDER BY zooId,jb->>'animal_type',jb->>'animal_name' -- ORDER BY zooId,"name" is far more efficient ) AS za ON za.zooId = zoo.id GROUP BY zoo.id; 你可以对jsonb对象的元素进行ORDER BY,如上所示,但是(据我所知)你不能在jsonb对象上使用DISTINCT.在你的情况下,无论如何这将是相当低效的(首先构建所有jsonb对象,然后丢弃重复项)并且在聚合级别上,使用标准SQL几乎是不可能的.但是,通过在构建jsonb对象之前应用DISTINCT子句,可以获得相同的结果. 另外,避免使用像“类型”这样的SQL key words和像“名称”这样的标准数据类型作为列名.两者都是非保留关键字,因此您可以在适当的环境中使用它们,但实际上您的命令可能会让人感到困惑.例如,你可以有一个模式,一个表,一个表中的列,以及一个名为“type”的数据类型,然后你可以得到这个: SELECT type::type FROM type.type WHERE type = something; 虽然PostgreSQL会慷慨地接受这一点,但它在最好的情况下很容易混淆,并且在各种更复杂的情况下容易出错.通过对任何关键词进行双重引用可以获得很长的路要走,但最好不要将它们作为标识符来避免. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |