使用子查询 postgres 的结果更新 CASE 语句中的列

Update column within CASE statement with results of a subquery postgres

我需要根据子查询的结果更新列。如果该列的子查询 returns 结果,则必须更新这些列,如果查询 returns 没有该列的结果,那么我需要更新为 0.

我不知道将子查询放在哪里以及如何将它与CASE 语句结合起来。这是我的想法,但语法不正确。有人可以帮忙吗?

(SELECT datazones.ogc_fid, count(*) as total 
FROM suppliersnew suppliers, datazone_report_resupply datazones
WHERE St_contains(datazones.geom, suppliers.geometry) AND (suppliers.status = 'Under construction' OR
suppliers.status = 'Unknown' OR suppliers.status = 'Operational') GROUP by datazones.ogc_fid ORDER BY total ASC) sources 

UPDATE datazone_report_resupply
SET es_actual =
CASE 
    WHEN datazone_report_resupply.ogc_fid = sources.ogc_fid THEN sources.total
    ELSE 0
END

查询有点难以理解,因为聚合在 outer 列上(这是不寻常的)。但是,您不需要聚合或排序依据。您似乎只关心一行是否存在。

我认为逻辑是:

UPDATE datazone_report_resupply r
SET es_actual =
    (CASE WHEN EXISTS (SELECT 1
                       FROM suppliersnew s
                       WHERE St_contains(r.geom, s.geometry) AND
                             s.status IN ('Under construction', 'Unknown', 'Operational')
                      ) 
          THEN 1 ELSE 0
      END);