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
但我不知道如何获取布尔列。输出应如下所示:
希望有人能帮忙。谢谢!
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 ...
- 对于
var
你需要添加一个简单的比较
- 对于带空值的
diff
,您可以使用 CASE
子句 (CASE WHEN value != 0 THEN value ELSE NULL END
) 或函数 NULLIF()
我正在做一些练习,我正在为这个练习而苦苦挣扎。假设我们有这两个表: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
但我不知道如何获取布尔列。输出应如下所示:
希望有人能帮忙。谢谢!
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 ...
- 对于
var
你需要添加一个简单的比较 - 对于带空值的
diff
,您可以使用CASE
子句 (CASE WHEN value != 0 THEN value ELSE NULL END
) 或函数NULLIF()