2017-07-12 41 views
0

我有具有2列的PostgreSQL 9.5表(樂器)JSON陣列列INSTRUMENT_ID和user_maps如下所示的結果是:取從postgres的

enter image description here

我想獲取基於以下條件的所有儀器:

  • 遍歷user_maps每個JSON對象
  • 計數具有沿Y狀態JSON對象的數量,N或d
  • 計數應大於2

注:user_maps是具有2個字段的狀態和用戶id鏈接到INSTRUMENT_ID 「I01」

樣品user_maps JSON對象的數組:

[ 
    { 
    "status": "Y", 
    "userId": "ZU201707120539150007" 
    }, 
    { 
    "status": "D", 
    "userId": "ZU201707120540510008" 
    }, 
    { 
    "status": "I", 
    "userId": "ZU201707120542540009" 
    }, 
    { 
    "status": "I", 
    "userId": "ZU201707011725050001" 
    }, 
    { 
    "status": "Y", 
    "userId": "ZU201707120552050013" 
    } 
] 

儀器ID「I01」應該是最終結果。

另外,掛INSTRUMENT_ID 「I02」 樣品user_maps:

[ 
    { 
    "status": "I", 
    "userId": "ZU201707120539150007" 
    }, 
    { 
    "status": "I", 
    "userId": "ZU201707120540510008" 
    }, 
    { 
    "status": "I", 
    "userId": "ZU201707120542540009" 
    }, 
    { 
    "status": "I", 
    "userId": "ZU201707011725050001" 
    }, 
    { 
    "status": "Y", 
    "userId": "ZU201707120552050013" 
    } 
] 

儀器ID 「I02」 不該來的最終結果怎麼一回事,因爲它只有在(Y,N,d),具有狀態的一個JSON。

+0

你也可以說你已經寫的代碼,哪裏出了問題呢? – NSDmitry

+1

請閱讀http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557和接受的答案 –

+0

我想寫一個postgresql查詢 –

回答

0

如果我理解正確你的請求,那麼這就是你如何能做到這一點:

-- This is just test dataset as you provided 
WITH test(instrument_id, user_maps) AS (
      VALUES 
       ( 'I01'::text, 
        $$[ 
         { "status": "Y", "userId": "ZU201707120539150007" }, 
         { "status": "D", "userId": "ZU201707120540510008" }, 
         { "status": "I", "userId": "ZU201707120542540009" }, 
         { "status": "I", "userId": "ZU201707011725050001" }, 
         { "status": "Y", "userId": "ZU201707120552050013" } 
        ]$$::jsonb), 
       ( 'I02'::text, 
        $$[ 
         { "status": "I", "userId": "ZU201707120539150007" }, 
         { "status": "I", "userId": "ZU201707120540510008" }, 
         { "status": "I", "userId": "ZU201707120542540009" }, 
         { "status": "I", "userId": "ZU201707011725050001" }, 
         { "status": "Y", "userId": "ZU201707120552050013" } 
        ]$$::jsonb) 
     ) 
SELECT t.instrument_id, 
     count(u) 
FROM test t, 
     jsonb_array_elements(user_maps) u  -- does lateral join to get json array elements 
WHERE u -> 'status' ?| ARRAY['Y', 'N', 'D'] -- your search condition 
GROUP BY 1 
HAVING count(u) > 2;       -- the count condition you wanted 

-- This is the result of the query 
instrument_id | count 
---------------+------- 
I01   |  3 
(1 row) 
+0

因此,如果存在'Y,N和D',您想要統計該數組中的所有對象元素? –

+0

我編輯了我的答案,現在能夠正確滿足您的期望嗎? –

+0

是和那個計數應該大於2 –