在这种情况下,我有 2 个表:一个任务池表和一个订单表。
任务池
task_id(键) | order_id(int) | 状态(整数) | expire_time(时间戳) |
---|---|---|---|
20 | 1 | 0 | [时间戳] |
25 | 2 | 1 | [时间戳] |
订单
order_id(键) | 订单信息(varchar) | 订单日期时间(时间戳) |
---|---|---|
0 | “信息” | [时间戳] |
1 | “信息” | [时间戳] |
现在,我使用任务表中的相关 order_id,使用此查询从订单表中检索 order_info 和 order_datetime。
WITH t AS (
SELECT
task_id,
order_id,
status
FROM task_pool
WHERE
task_id = $1
AND
(status = 0 OR status = 1)
)
SELECT t.order_id, t.status,
order_info, order_datetime
FROM orders
INNER JOIN t ON orders.order_id=t.order_id`,
[req.body.task_id]
这有效(最有效的方法,我不知道)。它只会检索 1 行,因为 task_id 是唯一索引键。
我想做的是检查 IF t.status=0,如果是,则将expire_time更新为expire_time + 10分钟,并将status更新为1。
我知道我可以在 Node.js 中检查 results.rows[0],如果 status==0,则进行另一个 pg 查询来更新该行的 expire_time 和 status。
但是,除非不建议,否则我更愿意在原始查询中完成所有操作。
类似:
WITH t AS (
SELECT
task_id,
order_id,
status
FROM task_pool
WHERE
task_id = $1
AND
(status = 0 OR status = 1)
)
**IF t.status = 0 THEN
UPDATE
task_pool
SET
status = 1, expire_time = expire_time + (10 * interval '1 minute')
WHERE
task_id = $1
END IF;**
SELECT t.order_id, t.status,
order_info, order_datetime
FROM orders
INNER JOIN t ON orders.order_id=t.order_id`,
[req.body.task_id]
这可能吗?
您可以将您的
select
换成针对同一行的 update..returning
,但根据您的条件更新它,然后返回新值:
WITH t AS (
UPDATE task_pool
SET status=case when status=0
then 1
else status
end,
expire_time=case when status=0
then expire_time+'10 min'::interval
else expire_time
end
WHERE
task_id = $1
AND
(status = 0 OR status = 1)
RETURNING
task_id,
order_id,
status
)
SELECT t.order_id, t.status,
order_info, order_datetime
FROM orders
INNER JOIN t ON orders.order_id=t.order_id`,
[req.body.task_id]