Postgresql 使用JSONB_数组_元素,其中。。。状况良好
在线扑克玩家可以选择购买playroom 1或playroom 2的访问权限 他们可以因为作弊而被暂时禁止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
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;