我想为表中没有的值显示一些模板消息。
实施例:
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的初学者
答案 0 :(得分:0)
您的查询会选择all_tables
中table_name
RAM
,SHA
,EMPLOYEE
或E_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
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;