【问题标题】:get an column name from the table by passing value in oracle通过在 oracle 中传递值从表中获取列名
【发布时间】:2016-06-23 09:58:25
【问题描述】:

我想在 oracle 中查询通过传递值从表中获取列名。 意味着在大多数情况下 - 我们这样编写查询 - select * from table where column = 'value'. 但在我的情况下,我不知道列名。

谁能推荐我。 提前谢谢...

【问题讨论】:

  • 从 user_tables 中选择 *
  • select table_name from user_Tables where table_name = 'school_master';
  • 我有一个类似 'Maria' 的值,我想从 oracle 数据库中搜索列名和表名
  • 您想查找包含该值的任何列的名称(在任何表中?)?如果是这样,您的问题不清楚;和possible duplicate
  • “Maria”是包含在这些未知列中的一个或多个中的值吗?你怎么不知道要查看的列的名称?这是作业问题还是什么?

标签: oracle oracle11g


【解决方案1】:

您可以尝试构建动态查询来检查数据库的所有表。

设置:

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_COLUMNSDBA_TAB_COLUMNS,这取决于你的需要和你用户的权限;更多信息请参见here

另外,考虑USER_TAB_COLUMNS 将获得表和视图的列;如果您想将搜索限制在表格中,您可以通过TABLE_NAMETABLE_NAME 和@987654338 将USER_TAB_COLUMNS(ALL_TAB_COLUMNS, DBA_TAB_COLUMNS) 加入USER_TABLES (ALL_TABLES, DBA_TABLES) @ 如果你决定使用 ALL 或 DBA 表:

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>

【讨论】:

    【解决方案2】:
    select table_name from user_Tables where table_name = 'bogus';
    

    【讨论】:

    • 我有一个类似 'Maria' 的值,我想从 oracle 数据库中搜索列名和表名
    • OP 要求列名给定一个值。你的回答只会给他们他们已经拥有的表名。
    猜你喜欢
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 2010-10-01
    相关资源
    最近更新 更多