2017-10-14 3 views
1

私はpostgresql DBにテーブルユーザを持っています。このテーブルには、jsonbタイプのカラム設定が含まれています。ここではjson形式です:postgresql DBのjsonbカラムからデータを取得して配列として返します。空の結果を返します。

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

と私は配列内のすべてのデバイスのFCMを返すpostgres関数を書く必要があります。 ここに私の機能です。

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

を私は、PostgreSQL-9.4を使用してい@VaoTsun?。 –

答えて

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関数に挿入して、結果をArrayで返すことはできますか? 私はpostgresで新しいです。 –

+0

答えの中のselectは 'Array'を返します。 –

関連する問題