【问题标题】:retrieving data from jsonb column in postgresql DB functions as an array, return empty result从postgresql DB函数中的jsonb列中检索数据作为数组,返回空结果
【发布时间】:2017-10-14 16:58:57
【问题描述】:

我在 postgresql 数据库中有表用户,该表包含 jsonb 类型的列设置。这是json格式:

{
  "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 对象中检索设备 FCM。 还有其他更好的方法来检索 FCM 吗?

【问题讨论】:

  • 你的 postgres 版本是什么?..
  • @VaoTsun 我正在使用 postgresql-9.4。

标签: sql postgresql postgresql-9.4 pgadmin jsonb


【解决方案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": "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)

【讨论】:

  • 我如何将它插入到 postgresql 函数中以在数组中返回结果?我是 postgres 的新手。
  • 答案中的选择返回Array
猜你喜欢
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
相关资源
最近更新 更多