Oracle:如果存在TABLE_A,则返回count(*),否则返回0;否则,返回0。

时间:2018-08-26 01:24:28

标签: sql oracle

我只想使用一条SQL语句,但我尝试使用以下一条但失败了:

SELECT decode(TABLE_COUNT, 0, 0, SELECT COUNT(*) FROM TABLE_A) FROM
(
  SELECT COUNT(*) AS TABLE_COUNT FROM USER_TABLES WHERE TABLE_NAME = 'TABLE_A'
)

2 个答案:

答案 0 :(得分:1)

@RaymondNijland在评论中引用的dbms_xmlgen方法的示例:

create table table_a (id) as select level from dual connect by level <= 10;

select nvl(max(to_number(
  xmlquery('/ROWSET/ROW/C/text()'
    passing xmltype(dbms_xmlgen.getxml('select count(*) as c from ' || table_name))
    returning content)
  )), 0) as count
from user_tables
where table_name = 'TABLE_A';

     COUNT
----------
        10

drop table table_a purge;

select nvl(max(to_number(
  xmlquery('/ROWSET/ROW/C/text()'
    passing xmltype(dbms_xmlgen.getxml('select count(*) as c from ' || table_name))
    returning content)
  )), 0) as count
from user_tables
where table_name = 'TABLE_A';

     COUNT
----------
         0

通过更改过滤器并添加group-by子句,您可以轻松地将其扩展为一次查询多个表或架构中的所有表等。

答案 1 :(得分:0)

在这种情况下,如果正在使用的Oracle版本中提供了该功能,则可以使用WITH子句。下面是代码的样子。

注意:即使看起来像PL / SQL代码,这也是一条SELECT语句。 WITH子句支持在其中使用PL / SQL声明。

WITH
FUNCTION getCount(p_table_name IN VARCHAR2)
RETURN NUMBER IS
v_count NUMBER;
BEGIN
  EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||p_table_name INTO v_count;
  RETURN mycount;
EXCEPTION
  WHEN OTHERS THEN
    RETURN 0;
END;
SELECT getCount('hr.employee') FROM DUAL;

当表不存在时,WHEN OTHERS会捕获错误并返回0。如果表存在,它将从表中返回计数。

希望这对您有用。