首页 > 解决方案 > 从选择中更新,否则如果在 PostgreSQL 中为空,则恢复为其他选择

问题描述

我正在执行以下查询:

UPDATE "job" 
SET pending=true, completor='{client.uuid}' 
WHERE "number" IN 
    (
     SELECT "number" FROM "job" 
     WHERE pending=false AND closed=false AND gpu=false
     ORDER BY RANDOM() LIMIT 1
     FOR UPDATE SKIP LOCKED
    )
  AND pending=false AND closed=false AND gpu=false
;

但是,我希望它尝试job使用相同的查询来获取 a ,但需要csv=true,并且如果没有与该查询匹配的作业,它应该恢复为使用当前选择(如上面括号内使用的那样)。

这将是选择csv=true

    (
     SELECT "number" FROM "job" 
     WHERE pending=false AND closed=false AND gpu=false AND csv=true
     ORDER BY RANDOM() LIMIT 1
     FOR UPDATE SKIP LOCKED
    )
  AND pending=false AND closed=false AND gpu=false AND csv=true

我怎么能做到这一点,最好只在需要时执行第二个查询?

提前致谢。

标签: sqlpostgresql

解决方案


按可选标准排序。我假设csv是一个boolean类型并且 NULL 不符合标准。

UPDATE "job" 
SET pending=true, completor='{client.uuid}' 
WHERE "number" IN 
    (
     SELECT "number" FROM "job" 
     WHERE pending=false AND closed=false AND gpu=false
     ORDER BY coalesce(csv,false) DESC, RANDOM() 
     LIMIT 1
     FOR UPDATE SKIP LOCKED
    )
  AND pending=false AND closed=false AND gpu=false

推荐阅读