如果特定值的数据不存在,Oracle查询显示一些模板消息?

时间:2013-01-24 13:36:22

标签: oracle nvl

我想为表中没有的值显示一些模板消息。

实施例

select table_name from all_tables where table_name in('RAM','SHA,','EMPLOYEE','E_SCHOOL');

在上面给出的4个表中,只有 EMPLOYEE 表存在 所以我想不显示其他结果的值,而不显示任何值。

我为此尝试了nvl

select nvl(table_name,'NO VALUE') from all_tables where table_name in('RAM','SHA,','EMPLOYEE','E_SCHOOL');

但结果仍未到来

任何获得结果的建议......?

提前致谢,请原谅任何错误,因为我是DB的初学者

4 个答案:

答案 0 :(得分:0)

您的查询会选择all_tablestable_name RAMSHAEMPLOYEEE_SCHOOL的所有记录。如果仅存在EMPLOYEE,则仅返回该记录,并且当您使用NVL时 - 它执行您认为的操作 - 它将正确显示表名称。您对in的使用感到困惑。

要做你想要的事情会更复杂:

with tablesImLookingFor as (
  select 'RAM' table_name from dual union all
  select 'SHA' table_name from dual union all
  select 'EMPLOYEE' table_name from dual union all
  select 'E_SCHOOL' table_name from dual
)
select    tablesImLookingFor.table_name,
          nvl(all_tables.table_name, 'Not found') table_exists
from      tablesImLookingFor
left join all_tables
on        all_tables.table_name = tablesImLookingFor.table_name;

...会返回类似的内容:

table_name   table_exists
============ =============
RAM          Not found
SHA          Not found
EMPLOYEE     EMPLOYEE
E_SCHOOL     Not found

但是,有更好的方法来检查匹配;使用内部联接可以在没有nvl业务的情况下完成。

无论如何,总而言之,您正确使用NVL

答案 1 :(得分:0)

with table_names (table_name) as (
    select 'RAM' from dual
    union all
    select 'SHA' from dual
    union all 
    select 'EMPLOYEE' from dual
    union all 
    select 'E_SCHOOL' from dual
)
select nvl(at.table_name, 'NO VALUE')
from table_names tn
  left join all_tables at on at.table_name = tn.table_name

答案 2 :(得分:0)

我很困惑,因为其他两个答案都完全没问题。是不是你不想一直输入“来自双重”等?如果是这样的话更短的版本是:

create type varchar2_tab as table of varchar2(30);
/
with tables as (select value(t) table_name
                  from table(varchar2_tab('RAM','SHA','EMPLOYEE','E_SCHOOL')) t)
select my_tab.table_name, nvl2(t.table_name, 'FOUND', 'NOT FOUND')
  from tables my_tab
       left outer join all_tables t
                    on t.table_name = my_tab.table_name;

或者如果您无法创建自己的类型:

with tables as (select value(t) table_name
                  from table(sys.DBMSOUTPUT_LINESARRAY(
                          'RAM','SHA','EMPLOYEE','E_SCHOOL')) t)
select my_tab.table_name, nvl2(t.table_name, 'FOUND', 'NOT FOUND')
  from tables my_tab
       left outer join all_tables t
                    on t.table_name = my_tab.table_name;

您可以使用

查看可用的公共收藏集
 select owner, type_name, coll_type, upper_bound, length 
   from all_coll_types 
  where elem_type_name = 'VARCHAR2' and length >= 30
  • 和ALL_TABLES一样,你正在查看许多模式而不包含所有者子句。你应该穿上(n t.table_name = my_tab.table_name and t.owner = 'XX'),或者,如果你作为桌面所有者连接,只​​需使用用户视图

答案 3 :(得分:0)

如果要显示每一行,只显示少数几个NO VALUE,则无需加入单独的表。您只需转换select子句中的值:

select case when table_name in ('RAM', 'SHA', 'E_SCHOOL') then
         'NO VALUE'
       else
         table_name
       end table_name
from   all_tables;