2016-06-23 7 views
-1

値を渡すことによってテーブルから列名を取得するためにoracleのクエリを使用します。 ほとんどの場合 - そのようなクエリ - select * from table where column = 'value'と書いています。しかし私の場合、私は列名を知らない。oracleで値を渡してテーブルから列名を取得

誰でも私に示唆することができます。事前に おかげで...

+0

選択:あなたがテーブルに検索を制限したい場合は、ALLまたはDBAのテーブルを使用する場合は、USER_TAB_COLUMNSALL_TAB_COLUMNSDBA_TAB_COLUMNS)にUSER_TABLESALL_TABLESDBA_TABLESTABLE_NAMEによって、またはTABLE_NAMEOWNERに参加することができます* from user_tables –

+0

user_tablesからtable_nameを選択します。ここで、table_name = 'school_master'; –

+0

「Maria」のような値があり、Oracleデータベースから列名と表名を検索したい – MakDeveloper

答えて

-1
select table_name from user_Tables where table_name = 'bogus'; 
+0

私は 'Maria'のような価値があり、私はoracleデータベースから列名とテーブル名を検索したい – MakDeveloper

0

あなたのDBのすべてのテーブルをチェックするために、動的クエリを作成しようとすることができます。

セットアップ:

create table tab1 (v1 varchar2(100), n1 number, v1b varchar2(100)); 
create table tab2 (v2 varchar2(100), n2 number, v2b varchar2(100)); 
create table tab3 (v3 varchar2(100), n3 number, v3b varchar2(100)); 
insert into tab1 values ('Maria', 1, 'aa'); 
insert into tab1 values ('xx', 2, 'bb'); 
insert into tab2 values ('yy', 3, 'Maria'); 
insert into tab2 values ('zz', 3, 'cc'); 
insert into tab3 values ('WW', 4, 'DD'); 

動的問合せの構築:これはあなたがすべてのテーブルをチェックするために実行することができ、クエリを返します

select 'select table_name, 
       matches from (' || listagg(statement, ' UNION ALL ') within group (order by table_name) || ') 
     where matches > 0' 
from (  
    select 'select ''' || table_name || 
      ''' as TABLE_NAME, count(1) as MATCHES from ' || table_name || ' WHERE ' || 
      listagg(column_name || ' = ''Maria''', ' OR ') within group (order by column_name) as statement, 
      table_name 
     from user_tab_columns col 
     where data_type = 'VARCHAR2' 
     group by table_name 
    ) 

を。私の例では、これは(フォーマットされていない)クエリを作成します:

SELECT table_name, matches 
    FROM (SELECT 'TAB1' AS TABLE_NAME, COUNT(1) AS MATCHES 
      FROM TAB1 
     WHERE V1 = 'Maria' 
       OR V1B = 'Maria' 
     UNION ALL 
     SELECT 'TAB2' AS TABLE_NAME, COUNT(1) AS MATCHES 
      FROM TAB2 
     WHERE V2 = 'Maria' 
       OR V2B = 'Maria' 
     UNION ALL 
     SELECT 'TAB3' AS TABLE_NAME, COUNT(1) AS MATCHES 
      FROM TAB3 
     WHERE V3 = 'Maria' 
       OR V3B = 'Maria') 
WHERE matches > 0; 

このクエリを実行すると得られます:

TABL MATCHES 
---- ---------- 
TAB1   1 
TAB2   1 

を、私はこれだけで、ログインのテーブルで検索、USER_TAB_COLUMNSを使用していることに注意してくださいスキーマ。異なるスキーマで検索する場合は、必要なものとユーザーの権限に応じて、ALL_TAB_COLUMNSまたはDBA_TAB_COLUMNSを使用できます。何かについてはhereを参照してください。

また、USER_TAB_COLUMNSはテーブルとビューの列を取得すると考えられます。

SQL> create view vTab1 as select * from tab1; 

View created. 

SQL> select count(1) 
    2 from user_tab_columns 
    3 where table_name = 'VTAB1'; 

    COUNT(1) 
---------- 
     3 

SQL> select count(1) 
    2 from user_tab_columns 
    3  inner join user_tables using(table_name) 
    4 where table_name = 'VTAB1'; 

    COUNT(1) 
---------- 
     0 

SQL> 
関連する問題