【问题标题】:CASE statement subquery row count to be used as the result用作结果的 CASE 语句子查询行数
【发布时间】:2021-01-29 00:47:02
【问题描述】:

到目前为止,我有一个表格的 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

这样可以完成工作,但听起来不是很有说服力。

【问题讨论】:

    标签: sql postgresql count subquery case


    【解决方案1】:

    由于您使用的是案例,所以我假设您仅在没有 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
    

    【讨论】:

      【解决方案2】:

      如果您想将它放在一列中,只需执行以下操作:

      COALESCE(
        nullif((SELECT COUNT(*) FROM subtable WHERE subtable.column1value = '100'), 0),
        (SELECT COUNT(*) FROM subtable WHERE subtable.column1value = '100')
      ) 
      

      如果第一个计数为零(合并将转到第二个查询),则第一个 null,然后计数第二个表 - 如果没有记录,那么最后将是 0。

      【讨论】:

        【解决方案3】:

        您可以使用子查询:

        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 子句中文字值周围的单引号;如果这些列是数字,那么它们应该被比较。

        【讨论】:

        • 我的错 - '100' 应该是更长 varchar 列值的简化示例。稍微编辑了我原来的帖子,看起来不那么混乱。 :)
        最近更新 更多