截至目前,我有一个CASE语句,格式为
CASE
WHEN exists (SELECT * FROM subtable WHERE subtable.column1value = 's100')
THEN 'exists in column 1'
WHEN exists (SELECT * FROM subtable2 WHERE subtable2.column2value = 's100')
THEN 'exists in column 2'
ELSE ''
END
换句话说,我有一个合约产品组件,该组件可以存在于不同的地方,因此我必须搜索这些表和列,并且我希望每个合约都有一个列来指定该合约是否具有此类产品组件在任何地方。
现在,我想更改此设置以跟踪每个合同中有多少个组件,并保存该值,就像
CASE
WHEN exists (SELECT COUNT(*) FROM subtable WHERE subtable.column1value = 's100')
THEN COUNT(*)
WHEN exists (SELECT COUNT(*) FROM subtable2 WHERE subtable2.column2value = 's100')
THEN COUNT(*)
ELSE 0
END
但这显然行不通。有什么办法可以改写此名称,以便为每个子查询的计数结果提供别名,或者是否有更好的方法?也许只有多个子查询,我可以在其中选择结果计数,然后再选择另一列作为这些列的总和?
(SELECT COUNT(*) FROM subtable WHERE subtable.column1value = 's100') AS result_column1,
(SELECT COUNT(*) FROM subtable2 WHERE subtable2.column2value = 's100') AS result_column2,
(result_column1 + result_column2) AS sum_of_results
那可以完成工作,但听起来并不雄辩。
答案 0 :(得分:1)
您可以使用子查询:
select result_column1, result_column2, result_column1 + result_column2 sum_of_results
from (
select
(select count(*) from subtable where subtable.column1value = 100) as result_column1,
(select count(*) from subtable2 where subtable2.column2value = 100) as result_column2
) x
请注意,我删除了where
子句中文字值周围的单引号;如果这些列是数字列,则应这样比较它们。
答案 1 :(得分:0)
如果您希望将其放在一列中,请执行以下操作:
COALESCE(
nullif((SELECT COUNT(*) FROM subtable WHERE subtable.column1value = '100'), 0),
(SELECT COUNT(*) FROM subtable WHERE subtable.column1value = '100')
)
如果第一个计数为零(coalesce将继续第二个查询),则第一个为null,然后对第二个表进行计数-如果没有记录,则末尾为0。
答案 2 :(得分:0)
由于使用的是案例,因此我假设仅当没有子表时才需要第二列值。column1value='100'记录
select
(CASE WHEN (SELECT true FROM subtable WHERE subtable.column1value = '100' limit 1) THEN (SELECT COUNT(*) FROM subtable WHERE subtable.column1value = '100')
WHEN (SELECT true FROM subtable2 WHERE subtable2.column2value = '100' limit 1) THEN (SELECT COUNT(*) FROM subtable2 WHERE subtable2.column2value = '100')
ELSE 0 END) as column_name