PostgreSQL:布尔列验证条件是否为真

PostgreSQL: boolean column verify if condition true

我正在做一些练习,我正在为这个练习而苦苦挣扎。假设我们有这两个表:fiddle

Tab1 根据 tab2 中的各个项目存储 'rev'。这意味着所有状态为 's' 的项目(来自 tab2)的(价格 x nr_items)应该等于来自 tab1 的 'rev'。任务是检查这是真还是假,并将结果存储在新的布尔列 'ver' 中。新列 'diff' 计算 (nr_items x price)-rev 之间的差异(如果存在差异)。如果没有区别,则应返回 NULL,而不是 0。 到目前为止,设法将差值输出为 0 但不是 NULL:

WITH t2 AS
    (SELECT id,
     or_id,
     dat,
    (SUM(nr_items * price) filter(WHERE status='s')) AS org_rev
    FROM tab2
    GROUP BY id, or_id, dat
    ORDER BY id, or_id)
SELECT t2.id,
     t2.or_id,
     t2.dat,
     ROUND((t2.org_rev - t1.rev)::numeric,0) AS diff     
FROM t2
JOIN tab1 t1
ON t2.dat = t1.dat AND t1.id=t2.id
GROUP BY t2.id, t2.or_id, t2.dat, t2.org_rev, t1.rev

但我不知道如何获取布尔列。输出应如下所示:

希望有人能帮忙。谢谢!

demo:db<>fiddle

SELECT
    t1.rev = ROUND(t2.org_rev::numeric, 2) as var,   -- 1
    NULLIF(                                          -- 2
        ROUND((t2.org_rev - t1.rev)::numeric,0)      -- your diff function
        , 0
    ) as diff
FROM ...
  1. 对于var你需要添加一个简单的比较
  2. 对于带空值的 diff,您可以使用 CASE 子句 (CASE WHEN value != 0 THEN value ELSE NULL END) 或函数 NULLIF()