2017-10-18 36 views
0

我在jsonb數組上進行交叉連接,我正在尋找數組元素的row_number(或其等效值)。查看row_number文檔我發現除了「partition by」之外,我還需要做一個「order by」,但是沒有真正的排序標準可以使用 - 數組只有一個設置的順序,而且我需要將索引與其餘數據一起檢索到數組中。從jsonb_array_elements或jsonb_to_recordset獲取row_number

客戶端表將有條目類似這樣

{ 
    "id": "cj49q33oa000", 
    "email": { 
    "address": "", 
    "after": "2016-06-28T12:28:58.016Z", 
    "error": "Et corporis sed." 
    }, 
    "name": "Arnold Schinner", 
    "birthdate": "2016-07-29T05:09:33.693Z", 
    "status": "paused", 
    "sex": "f", 
    "waist": [ 
    { 
     "completed": "2017-06-23T10:37:37.500Z" 
    }, 
    { 
     "planned": "2017-06-23T10:37:37.500Z" 
    }, 
    { 
     "planned": "2017-06-23T10:37:37.500Z" 
    }, 
    { 
     "planned": "2017-06-23T10:37:37.500Z" 
    } 
    ] 
} 

,我會運行一個查詢像

SELECT client->>'id' AS id, waist.planned 
FROM clients 
CROSS JOIN LATERAL JSONB_TO_RECORDSET(client->'waist') AS waist(planned TIMESTAMP WITH TIME ZONE) 
WHERE waist.planned IS NOT NULL 

,但我需要得到waist.position_in_array以某種方式。

回答

1

使用功能jsonb_array_elements(...)with ordinality.

SELECT client->>'id' AS id, (value->>'planned')::timestamptz as planned, ordinality 
FROM clients 
CROSS JOIN LATERAL jsonb_array_elements(client->'waist') with ordinality 
WHERE value->>'planned' IS NOT NULL; 

     id  |   planned   | ordinality 
--------------+--------------------------+------------ 
cj49q33oa000 | 2017-06-23 12:37:37.5+02 |   1 
cj49q33oa000 | 2017-06-23 12:37:37.5+02 |   2 
cj49q33oa000 | 2017-06-23 12:37:37.5+02 |   3 
cj49q33oa000 | 2017-06-23 12:37:37.5+02 |   4 
(4 rows)