【问题标题】:How to check which columns exist in SQL如何检查 SQL 中存在哪些列
【发布时间】:2017-01-05 19:18:45
【问题描述】:

所以我有一个潜在列的列表,我知道我可以检查某个列是否存在。

SELECT null
  FROM user_tab_columns
  WHERE table_name = 'MYTABLE' and column_name = 'MYCOLUMN'

如何扩展它以测试多个列?即不确定确切的语法是什么。

SELECT null, null, null
  FROM user_tab_columns
  WHERE table_name = 'MYTABLE' and column_name = 'MYCOLUMN' 
  or column_name = 'MYCOLUMN1' or column_name = 'MYCOLUMN2'

【问题讨论】:

  • 你不能用DESCRIBE user_tab_columns吗?
  • 你能澄清一下你到底想要做什么吗?这里的预期结果是什么?
  • 我基本上只是希望它根据列是否存在打印真或假。我是 SQL 新手,我想我正在尝试使用 id 在 python 中执行的操作。
  • 您在哪里有单独表格中的潜在列列表?
  • 我有一个用 Python 生成的文本列表,我打算遍历它来创建 SQL 语句

标签: sql oracle exists


【解决方案1】:

在这里,我创建了一个带有单列的表,column_name。我在SCOTT 模式的表EMP 中测试column_name 的存在。我假设所有表、列和模式名称都已经是大写的(因为所有目录字符串值都是大写的),否则您将需要不区分大小写的比较。此示例假定当前用户可以访问 SCOTT 模式(大多数 Oracle 安装中的标准模式),并且我使用表 ALL_TAB_COLUMNS 而不是 USER_TAB_COLUMNS(它只查看当前用户的表)。

with
     potential_columns ( column_name ) as (
       select 'EMPNO'   from dual union all
       select 'NAME'    from dual union all
       select 'MANAGER' from dual union all
       select 'DEPTNO'  from dual
     )
select p.column_name, 
       case when t.column_name is null then 'FALSE' else 'TRUE' end 
          as column_exists_in_table
from potential_columns p left outer join 
     (select column_name from all_tab_columns 
        where owner = 'SCOTT' and table_name = 'EMP') t
on p.column_name = t.column_name
;

COLUMN_NAME COLUMN_EXISTS_IN_TABLE
----------- ----------------------
EMPNO       TRUE 
DEPTNO      TRUE 
MANAGER     FALSE
NAME        FALSE

【讨论】:

    【解决方案2】:

    也许这段代码会有用(我相信一定有更好的解决方案):

    select count(table_name) from all_tab_columns where column_name = 'YOUR_COLUMN';
    

    对于多个列,试试这个:

    select count(table_name) from all_tab_columns where column_name in ( 'YOUR_COLUMN_1','YOUR_COLUMN_2')
    

    如果表不存在,则返回 0。

    希望对你有用

    【讨论】:

    • 那么如果我有多个列 Id 想要测试,我怎么能在一个 SQL 语句中完成呢?
    • @SharpObject 我编辑了答案,请尝试第二个示例。
    • 酷,有没有办法告诉我哪些不存在?因为这只是说存在多少
    【解决方案3】:

    现在你得到了正确的答案,进入你的查询它会执行类似下面的操作,因为在 Oracle SQL 中ANDOR 具有更高的优先级。

    SELECT null, null, null
      FROM user_tab_columns
      WHERE (table_name = 'MYTABLE' and column_name = 'MYCOLUMN')    <-- MYCOLUMN in MYTABLE
      or column_name = 'MYCOLUMN1'                                   <-- MYCOLUMN1 in ANYTABLE
      or column_name = 'MYCOLUMN2'                                   <-- MYCOLUMN2 in ANYTABLE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-27
      • 2010-09-18
      • 2017-05-20
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      相关资源
      最近更新 更多