从postgresql DB函数中的jsonb列检索数据作为数组,返回空结果
我在postgresql数据库中有表用户,该表包含jsonb类型的列设置。这里是json格式:从postgresql DB函数中的jsonb列检索数据作为数组,返回空结果,sql,postgresql,postgresql-9.4,pgadmin,jsonb,Sql,Postgresql,Postgresql 9.4,Pgadmin,Jsonb,我在postgresql数据库中有表用户,该表包含jsonb类型的列设置。这里是json格式: { "device": { "352fef5aa349d63c": { "fcm": "Rg_4rdTaPwifTh-sP8gtRdI7VdMO_sShhuYbEpplVtmSfmIo8kkmqzIaFxfw59QXg3il95Y", "agent": "android", "language": "en", "app_version": 1
{
"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": "any@gmail.com",
"_password": "grmbn9",
"_username": "username",
"_member_id": 57076
},
"email_status": 2,
"email_verify_code": 9579
}
我必须编写一个postgres函数来返回数组中的所有设备fcm。
这是我的职责
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对象检索设备FCMs。
还有其他更好的方法来检索FCM吗?我会选择它:
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": "any@gmail.com",
"_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)
您的postgres版本是什么?@VaoTsun我使用的是postgresql-9.4。如何将其插入postgresql函数中以数组形式返回结果?我是postgres新手。选择答案返回
Array