PostgreSQL 9.6中的JSON查询

时间:2017-05-10 12:22:53

标签: json postgresql hibernate

推测以下数据:

select * from orderlist ;
 id |                   orders                   | orderenvelope_id 
----+--------------------------------------------+------------------
 14 | {                                         +|               13
    |   "orders" : [ {                          +| 
    |     "orderType" : "OfferPurchaseOrder",   +| 
    |     "duration" : 1494413009450,           +| 
    |     "currencyCode" : "EUR"                +| 
    |   }, {                                    +| 
    |     "orderType" : "CustomerCreationOrder",+| 
    |     "customerData" : {                    +| 
    |       "customerType" : "PERSONAL_ACCOUNT",+| 
    |       "contactData" : {                   +| 
    |         "contactQuality" : "VALID",       +| 
    |         "firstName" : "Peter",            +| 
    |         "lastName" : "Pan"                +| 
    |       }                                   +| 
    |     }                                     +| 
    |   } ]                                     +| 
    | }                                          | 

我希望得到' OfferPurchaseOrder&#39 ;;因此使用了以下SELECT:

 select id, orderenvelope_id, o from orderlist list, json_array_elements(list.orders->'orders') as o where o->>'orderType' = 'OfferPurchaseOrder';

     id | orderenvelope_id |                    o                    
----+------------------+-----------------------------------------
 14 |               13 | {                                      +
    |                  |     "orderType" : "OfferPurchaseOrder",+
    |                  |     "duration" : 1494413009450,        +
    |                  |     "currencyCode" : "EUR"             +
    |                  |   }

它看起来好像是一个魅力,只有一件事:我想与Hibernate集成,所以colum应该被命名为' orders'而不是' o' (因为它是在初始选择中);否则Hibernate将无法正确映射事物。 除此之外,'减少' JSON列表应该在那里,所以期望的结果应该如下所示:

 id | orderenvelope_id |                    orders              |            
----+------------------+----------------------------------------+
 14 |               13 | "orders" : [{                          +
    |                  |     "orderType" : "OfferPurchaseOrder",+
    |                  |     "duration" : 1494413009450,        +
    |                  |     "currencyCode" : "EUR"             +
    |                  |   }                                    +
    |                  |]

任何提示?

感谢和问候 el subcomandante

1 个答案:

答案 0 :(得分:2)

如果您可以移动到jsonb类型,则查询可能如下所示:

WITH x AS (
   SELECT id, orderenvelope_id, o
   FROM orderlist list, jsonb_array_elements(list.orders->'orders') as o
   WHERE o->>'orderType' = 'OfferPurchaseOrder'
)
SELECT id, orderenvelope_id, jsonb_set('{}'::jsonb, '{orders}'::text[], jsonb_agg(o))
FROM x
GROUP BY 1,2
;

但是,如果你不能使用jsonb只是将文本转换为json:

WITH x AS (
   SELECT id, orderenvelope_id, o
   FROM orderlist list, json_array_elements(list.orders->'orders') as o
   WHERE o->>'orderType' = 'OfferPurchaseOrder'
)
SELECT id, orderenvelope_id, ('{"orders": ' || json_agg(o) ||'}')::json
FROM x
GROUP BY 1,2
;