如何在 ORACLE 上将计数作为 IF 条件传递

Posted

技术标签:

【中文标题】如何在 ORACLE 上将计数作为 IF 条件传递【英文标题】:How to pass a count as IF condition on ORACLE 【发布时间】:2018-12-18 19:51:38 【问题描述】:

我想在 ORACLE 上使用 COUNT 结果作为 IF CONDITION,就像 oracle 上的这个伪代码:

select count(d.number_people) as counted_people
from dual d
if counted_people = 1 then
dbms_output.put_line('Have just one people on this column.'
end if;

这个语法是错误的,我知道,我该怎么做?

【问题讨论】:

DUAL 是一个特殊的单行一列的表,它没有number_people 列,使用@987654325 不清楚你想从这个表中统计多少人@ ? 举个例子,问题是如何使用count as if语句 if (select count(column) from table) > 0 then的可能重复 【参考方案1】:

使用SELECT ... INTO variable ... 演示:https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=610d02797857539be5fcd4afdbd7d9e6

DECLARE 
  cnt number;
BEGIN
  select count(*) INTO cnt from dual;
  IF cnt = 1 THEN
     DBMS_OUTPUT.PUT_LINE('Exaclty one record');
  ELSE
     DBMS_OUTPUT.PUT_LINE('0 or more than 1  record');
  END IF;
END;
/

【讨论】:

【参考方案2】:

COUNT 是一个聚合结果。您可以对表中的所有行、符合特定条件的所有行等进行计数。作为聚合结果,您可以在SELECT 子句、HAVING 子句和ORDER BY 子句中使用它。 (您不能在WHERE 子句中使用它,因为WHERE 子句处理表行中的数据。您需要一个HAVING 子句来处理聚合结果。)

SELECT 子句/ORDER BY 子句示例

select
  supplier_id,
  case when count(*) < 20 then 'less then 20 orders'
       when count(*) < 40 then 'less beteen 20 and 40 orders'
       else '40 or more orders'
  end as number_of_orders
from orders
where order_date >= date '2018-01-01'
group by supplier_id
order by count(*) desc;

HAVING 子句示例

select sex, count(*)
from members
group by sex
having count(*) > 20;

【讨论】:

我从 v4 (1985) 开始一直在做 Oracle,这是我第一次看到这个 group by 条款。 我的评论应该是个玩笑,因为您分组的特定列。 @Roger Cornejo:啊,抱歉。是的,我必须承认,在输入查询时,我想知道GROUP BY 中的BY 是否是可选的;-) :-)) 好笑:-))

以上是关于如何在 ORACLE 上将计数作为 IF 条件传递的主要内容,如果未能解决你的问题,请参考以下文章

没有 else 子句的单行 If 条件 [重复]

如何在GET上将变量从一个页面(视图)传递到另一个页面?

如何在 z/OS 上将 java 作为作业步骤运行

如何在使用 WHERE 删除的行上将计数值显示为 0(微软访问)

Oracle:如何使用 if 条件在存储过程中调用存储过程

哨兵与传递计数