2017-10-14 6 views
1

J'ai des utilisateurs de tables dans un DB postgresql, La table contient un paramétrage de colonne de type jsonb. et ici il est le format JSON:Récupérer des données de la colonne jsonb dans les fonctions DB postgresql sous forme de tableau, retourner un résultat vide

{ 
    "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 
} 

et je dois écrire un postgres fonction pour renvoyer tous les appareils FCMs dans le tableau. et ici c'est ma fonction.

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; 

et quand j'exécute

SELECT GetUserFCM(33) as result; 

il ne retourne rien. toute aide comment pourrais-je récupérer les dispositifs FCM de l'objet json s'il vous plaît. et existe-t-il un autre moyen de récupérer les FCM?

+0

quel est votre version postgres .. –

+0

@VaoTsun J'utilise postgresql-9.4?. –

Répondre

1

Je voudrais simplement sélectionner:

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

Et comment pourrais-je l'insérer dans une fonction postgresql pour retourner le résultat dans Array? Je suis nouveau dans postgres. –

+0

le select dans la réponse retourne 'Array' –