当EXISTS(SELECT ...)似乎总是返回true时的情况

时间:2018-06-18 07:21:58

标签: sql oracle plsql

我需要测试表是否存在。如果它存在,我需要获取该表的rowcount,否则我需要将rowcount值设置为NULL。

以下是我使用的查询片段:

SELECT 
    CASE 
    -- TABLE A does not exists
        WHEN EXISTS (Select TABLE_NAME from ALL_TABLES where TABLE_NAME ='A') 
            THEN (SELECT COUNT(*) FROM SYS."A") 
            ELSE NULL
        END AS TABLE_count
FROM dual; 

执行此查询时,收到以下错误消息:

SQL Error [942] [42000]: ORA-00942: table or view does not exist

似乎即使EXISTS返回0行,也总是执行THEN子句而不是进入ELSE子句。

我不明白这里的行为。 有什么想法吗?

谢谢

1 个答案:

答案 0 :(得分:6)

您不能在纯SQL中执行此操作,因为查询是作为整体解析的,包括fill_value=0部分 因此,如果表SELECT COUNT(*) FROM SYS."A"不存在,那么整个查询将无法解析。

另一种方法是使用pl / sql。如果表存在则创建一个计算行的函数,否则返回null。

考虑以下示例:

SYS."A"

返回

create or replace function get_table_count(sTableName varchar2)
return number
is
  iCount number;
begin
  for c in (
    select null
    from   ALL_TABLES 
    where  TABLE_NAME = sTableName
  ) loop
    execute immediate 'select count(*) from '||sTableName into iCount;
    return iCount;
  end loop;
  return null;
end;
/

select get_table_count('DUAL') c1, get_table_count('ABSENT_TABLE') c2  from dual