Postgresql 使用JSONB_数组_元素,其中。。。状况良好

Postgresql 使用JSONB_数组_元素,其中。。。状况良好,postgresql,select,where-in,postgresql-9.5,postgresql-json,Postgresql,Select,Where In,Postgresql 9.5,Postgresql Json,在线扑克玩家可以选择购买playroom 1或playroom 2的访问权限 他们可以因为作弊而被暂时禁止 CREATE TABLE users ( uid SERIAL PRIMARY KEY, paid1_until timestamptz NULL, -- may play in room 1 paid2_until timestamptz NULL, -- may play in room 2 banne

在线扑克玩家可以选择购买playroom 1或playroom 2的访问权限

他们可以因为作弊而被暂时禁止

CREATE TABLE users (
        uid SERIAL PRIMARY KEY,

        paid1_until timestamptz NULL,     -- may play in room 1
        paid2_until timestamptz NULL,     -- may play in room 2

        banned_until timestamptz NULL,    -- punished for cheating etc.
        banned_reason varchar(255) NULL
);
上表中填写了4项试验记录:

INSERT INTO users (paid1_until, paid2_until, banned_until, banned_reason)
VALUES (NULL, NULL, NULL, NULL),
       (current_timestamp + interval '1 month', NULL, NULL, NULL),
       (current_timestamp + interval '2 month', current_timestamp + interval '4 month', NULL, NULL),
       (NULL, current_timestamp + interval '8 month', NULL, NULL);
所有4条记录都属于同一个人——她通过不同的社交网络(例如通过Facebook、Twitter、苹果游戏中心等)对自己进行了身份验证

我正在尝试创建一个存储函数,它将获取一个数字用户ID列表(作为JSON数组),并将属于同一个人的记录合并到一个记录中,而不会丢失她的付款或惩罚:

CREATE OR REPLACE FUNCTION merge_users(
        IN in_users jsonb,
        OUT out_uid integer)
        RETURNS integer AS
$func$
DECLARE
        new_paid1 timestamptz;
        new_paid2 timestamptz;
        new_banned timestamptz;
        new_reason varchar(255);
BEGIN
        SELECT min(uid),
                current_timestamp + sum(paid1_until - current_timestamp),
                current_timestamp + sum(paid2_until - current_timestamp),
                max(banned_until)
        INTO
                out_uid, new_paid1, new_paid2, new_banned
        FROM users 
        WHERE uid IN (SELECT JSONB_ARRAY_ELEMENTS(in_users));

        IF out_uid IS NOT NULL THEN
                SELECT banned_reason
                INTO new_reason
                FROM users
                WHERE new_banned IS NOT NULL
                AND banned_until = new_banned
                LIMIT 1;

                DELETE FROM users
                WHERE uid IN (SELECT JSONB_ARRAY_ELEMENTS(in_users))
                AND uid <> out_uid;

                UPDATE users 
                SET paid1_until = new_paid1,
                    paid2_until = new_paid2,
                    banned_until = new_banned,
                    banned_reason = new_reason
                WHERE uid = out_uid;
        END IF; 
END
$func$ LANGUAGE plpgsql;
请帮我解决这个问题

这里是为了方便您。

的结果是一组jsonb元素,因此您需要将
uid
的显式强制转换添加到带有函数的jsonb中,中的
将替换为运算符:

WITH t(val) AS ( VALUES
  ('[1,2,3,4]'::JSONB)
)
SELECT TRUE
FROM t,jsonb_array_elements(t.val) element
WHERE to_jsonb(1) <@ element;
带t(val)作为(值
(“[1,2,3,4]”:JSONB)
)
选择TRUE
来自t,jsonb_数组_元素(t.val)元素

何处使用jsonb(1)使用
jsonb
数组是否有特定的原因?为什么不使用
int[]
数组呢?是的,我想使用JSON,因为这就是我的移动应用程序与PHP+PostrgreSQL后端对话的方式。我确信我的问题可以用JSON解决,我只是缺少smth。少数的
WITH t(val) AS ( VALUES
  ('[1,2,3,4]'::JSONB)
)
SELECT TRUE
FROM t,jsonb_array_elements(t.val) element
WHERE to_jsonb(1) <@ element;