我有 2 个这样的查询:
SELECT c.id FROM component c, base_vee bv
WHERE
c.id IN (SELECT component_id FROM registry_row WHERE registry_id = 199)
AND
c.id = bv.component_id
AND
(bv.affidavit IS NULL OR bv.affidavit = '')
SELECT c.id FROM component c, base_vee bv
WHERE
c.id IN (SELECT component_id FROM registry_row WHERE registry_id = 199)
AND
c.id = bv.component_id
AND
(bv.affidavit IS NOT NULL AND bv.affidavit != '')
我需要得到的是一个组件 ID 列表,如果为空则为 False,如果bv.affidavit
不为空则为 True。
现在我显然得到了每个案例的两个组件 ID 列表。
它可以工作,但是像上面描述的那样的查询会更好。
使用
CASE
函数:当你处理“如果它为空做一件事,否则做另一件事”的情况时,COALESCE 会让你摆脱很多有趣的事情。
COALESCE 使用第一个非空参数,所以如果 bv.affidavit 恰好为 NULL,它将使用 '' 代替。我不需要在后续测试中测试它是否为 NOT NULL。