0

我想为表格中不存在的值显示一些模板消息。

示例

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

4 回答 4

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;
于 2013-01-24T15:06:50.713 回答
0

您的查询会选择其中all_tables包含、或table_name的所有记录。如果 only存在,那么只会返回该记录,并且当您使用时——它会按照你的想法做——它会正确显示表名。您对.RAMSHAEMPLOYEEE_SCHOOLEMPLOYEENVLin

做你正在寻找的东西更复杂:

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正确。

于 2013-01-24T13:46:16.820 回答
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
于 2013-01-24T13:46:24.073 回答
0

我很困惑,因为其他两个答案都很好。是不是你不想一直输入“from dual”等?如果是这样,则较短的版本是:

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') 或者,如果您以表所有者身份连接,则只需使用用户视图
于 2013-01-24T15:01:06.437 回答