2017-10-14 91 views
1

我在postgresql DB中擁有表用戶,該表包含jsonb類型的列設置。在這裏它是JSON格式:從postgresql中的jsonb列檢索數據作爲數組的DB函數返回空結果

{ 
    "device": { 
    "352fef5aa349d63c": { 
     "fcm": "Rg_4rdTaPwifTh-sP8gtRdI7VdMO_sShhuYbEpplVtmSfmIo8kkmqzIaFxfw59QXg3il95Y", 
     "agent": "android", 
     "language": "en", 
     "app_version": 1 
    }, 
    "3a922f2ead22ecb6": { 
     "fcm": "MkqSrdTkPwiU32-sPKA_S8I7VdMO_tShhuYbEpplVtmSfmLo6kkmqzIaFxfw59QXg3il94X", 
     "agent": "android", 
     "language": "en", 
     "app_version": 6 
    } 
    }, 
    "data": { 
    "_email": "[email protected]", 
    "_password": "grmbn9", 
    "_username": "username", 
    "_member_id": 57076 
    }, 
    "email_status": 2, 
    "email_verify_code": 9579 
} 

我必須編寫一個postgres函數來返回數組中的所有設備FCMs。 這裏是我的功能。

CREATE OR REPLACE FUNCTION GetUserFCM(userId int) 
RETURNS TEXT[] 
AS $$ 
    DECLARE user_devices jsonb; 
    DECLARE result TEXT[]; 
    DECLARE fcm TEXT[]; 
    DECLARE tmp TEXT; 
BEGIN 
    SELECT setting->'device' into user_devices FROM public."user" WHERE id = userId; 
    SELECT ARRAY(SELECT jsonb_object_keys((SELECT setting->'device' FROM public."user" WHERE id = userId)::jsonb)) into result; 

    FOR i IN 1 .. array_upper(result, 1) 
    LOOP 
     tmp := user_devices->i->'fcm'; 
     IF tmp IS NULL THEN 
      PERFORM array_append(fcm, tmp); 
     END IF; 
    END LOOP; 

    RETURN fcm; 
END 
$$ 
LANGUAGE plpgsql; 

,當我執行

SELECT GetUserFCM(33) as result; 

它沒有返回。任何幫助我怎麼能從json對象中檢索設備FCM。 ,有沒有更好的方法來檢索FCM?

+0

什麼是你的Postgres版本.. –

+0

@VaoTsun我使用PostgreSQL-9.4? –

回答

1

我會選擇它:

t=> with j(b) as (values('{ 
    "device": { 
    "352fef5aa349d63c": { 
     "fcm": "Rg_4rdTaPwifTh-sP8gtRdI7VdMO_sShhuYbEpplVtmSfmIo8kkmqzIaFxfw59QXg3il95Y", 
     "agent": "android", 
     "language": "en", 
     "app_version": 1 
    }, 
    "3a922f2ead22ecb6": { 
     "fcm": "MkqSrdTkPwiU32-sPKA_S8I7VdMO_tShhuYbEpplVtmSfmLo6kkmqzIaFxfw59QXg3il94X", 
     "agent": "android", 
     "language": "en", 
     "app_version": 6 
    } 
    }, 
    "data": { 
    "_email": "[email protected]", 
    "_password": "grmbn9", 
    "_username": "username", 
    "_member_id": 57076 
    }, 
    "email_status": 2, 
    "email_verify_code": 9579 
}'::jsonb) 
) 
, parse as (select b->'device'->jsonb_object_keys(b->'device')->>'fcm' jb from j) 
select array_agg(jb) from parse; 
                    array_agg 
--------------------------------------------------------------------------------------------------------------------------------------------------- 
{Rg_4rdTaPwifTh-sP8gtRdI7VdMO_sShhuYbEpplVtmSfmIo8kkmqzIaFxfw59QXg3il95Y,MkqSrdTkPwiU32-sPKA_S8I7VdMO_tShhuYbEpplVtmSfmLo6kkmqzIaFxfw59QXg3il94X} 
(1 row) 
+1

我怎麼能插入這postgresql函數返回數組中的結果? 我是新來的postgres。 –

+0

回答中的選擇返回'Array' –