微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql – 如何在postgresSQL中的jsonb值的array_agg中组合DISTINCT和ORDER BY

注意:我使用的是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会慷慨地接受这一点,但它在最好的情况下很容易混淆,并且在各种更复杂的情况下容易出错.通过对任何关键词进行双重引用可以获得很长的路要走,但最好不要将它们作为标识符来避免.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐