CASE 语句子查询行数用作结果
CASE statement subquery row count to be used as the result
截至目前,我有一个形式为
的 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 结果的计数,然后是这些列的总和的另一列?
(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
这样可以完成工作,但听起来不太好 eloquent。
您可以使用子查询:
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
子句中文字值周围的单引号;如果这些列是数字,那么应该这样比较它们。
如果您想将它放在一栏中,只需执行以下操作:
COALESCE(
nullif((SELECT COUNT(*) FROM subtable WHERE subtable.column1value = '100'), 0),
(SELECT COUNT(*) FROM subtable WHERE subtable.column1value = '100')
)
如果第一个计数为零,则第一个为空(合并将继续进行第二个查询),然后计数第二个table - 如果没有记录,则最后将为 0。
由于您使用的是 case,所以我假设您仅在没有 subtable.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
截至目前,我有一个形式为
的 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 结果的计数,然后是这些列的总和的另一列?
(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
这样可以完成工作,但听起来不太好 eloquent。
您可以使用子查询:
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
子句中文字值周围的单引号;如果这些列是数字,那么应该这样比较它们。
如果您想将它放在一栏中,只需执行以下操作:
COALESCE(
nullif((SELECT COUNT(*) FROM subtable WHERE subtable.column1value = '100'), 0),
(SELECT COUNT(*) FROM subtable WHERE subtable.column1value = '100')
)
如果第一个计数为零,则第一个为空(合并将继续进行第二个查询),然后计数第二个table - 如果没有记录,则最后将为 0。
由于您使用的是 case,所以我假设您仅在没有 subtable.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