- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在线扑克玩家可以选择购买游戏室 1 或游戏室 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、Apple Game Center 等)对自己进行身份验证
我正在尝试创建一个存储函数,它将采用数字用户 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;
不幸的是,它的使用会导致以下错误:
# TABLE users;
uid | paid1_until | paid2_until | banned_until | banned_reason
-----+-------------------------------+-------------------------------+--------------+---------------
1 | | | |
2 | 2016-03-27 19:47:55.876272+02 | | |
3 | 2016-04-27 19:47:55.876272+02 | 2016-06-27 19:47:55.876272+02 | |
4 | | 2016-10-27 19:47:55.876272+02 | |
(4 rows)
# select merge_users('[1,2,3,4]'::jsonb);
ERROR: operator does not exist: integer = jsonb
LINE 6: WHERE uid IN (SELECT JSONB_ARRAY_ELEMENTS(in_users))
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
QUERY: SELECT min(uid),
current_timestamp + sum(paid1_until - current_timestamp),
current_timestamp + sum(paid2_until - current_timestamp),
max(banned_until)
FROM users
WHERE uid IN (SELECT JSONB_ARRAY_ELEMENTS(in_users))
CONTEXT: PL/pgSQL function merge_users(jsonb) line 8 at SQL statement
请帮我解决这个问题。
这里是 a gist with SQL code为了您的方便。
最佳答案
jsonb_array_elements()
的结果是一组 jsonb 元素,因此您需要添加 uid
的显式转换使用 to_jsonb()
到 jsonb功能,IN
将替换为 <@
运算符(operator):
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;
对于您的情况,代码段应调整为:
...SELECT ...,JSONB_ARRAY_ELEMENTS(in_users) user_ids
WHERE to_jsonb(uid) <@ user_ids...
关于postgresql - 将 JSONB_ARRAY_ELEMENTS 与 WHERE ... IN 条件一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35673982/
我有一个名为 info 的 jsonb 列,某些类型具有对象的形式:{ id: 2 } 和一些其他类型它具有数组的形状:[{ id: 2 }] 我有一个执行此操作的查询: SELECT * FROM
我有一个 PostgreSQL 表(creatures),如下所示: | id | json | ------------------------------- | 1 |
我有一个包含多行的 JSONB 列的表。每行包含一个 JSON 数组。 现在我需要将其放入行中,但我还需要元素的位置。 例如 select * from ( select jsonb_array
我正在访问 jsonb 字段中的数组(一个名为“choice_values”的 json 对象),并想将其内容解析为逗号分隔的文本字段。 SELECT jsonb_array_elements
我正在使用 SQLAlchemy ORM 并试图弄清楚如何生成 PostgreSQL 查询,大致如下: SELECT payments.* FROM payments, jso
我有一个带有 jsonb 数据类型列标签的 MessagesList 表。列中的数据类似于 ["abc","xyz"]。我需要在列中搜索值“abc” 我的查询 select value from me
我想使用 json_array_elements 来扩展 json 数组。但它的工作方式很奇怪。请看下面。 select json_array_elements('[1, 2]') as a, jso
在线扑克玩家可以选择购买游戏室 1 或游戏室 2 的使用权。 并且他们可以因作弊而被暂时禁止。 CREATE TABLE users ( uid SERIAL PRIMARY KEY,
尝试分配 JSONB_ARRAY_ELEMENTS 的结果时调用VARCHAR array (供以后在 SELECT ... WHERE IN (UNNEST(...)) 语句中使用),以下存储函数:
我尝试搜索解决方案,但没有找到适合我的情况的任何内容... 这是数据库声明(简化): CREATE TABLE documents ( document_id int4 NOT NULL GE
我在 jsonb 数组上进行横向交叉连接,我希望获取数组元素的 row_number(或其等效项)。查看 row_number 文档,我发现除了“分区依据”之外,我还需要执行“排序依据”,但实际上并没
我有occasion 和relation 表。 relation.occasions是一个json类型的字段,里面包含了一个occasion key的数组。我想通过关系获取 occasion 记录,其
繁花似锦, 我有一个像这样的 JSON 数组 items (PostgreSQL 9.4): [{name: "foo"}, {name: "bar"}, {name: "baz"}] 我想要的是
我是一名优秀的程序员,十分优秀!