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
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

他の2つの答えは完全に大丈夫なので、私は混乱しています。いつも「デュアルから」などと入力したくないということですか?もしそうなら、短いバージョンは次のとおりです。

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 に答える
0

クエリは、 、 、または を持つすべてのレコードを選択しall_tablesます。のみが存在する場合は、そのレコードのみが返され、使用すると、考えていることを実行すると、テーブル名が正しく表示されます。の使い方に混​​乱しています。table_nameRAMSHAEMPLOYEEE_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

すべての行を表示したい場合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 に答える