如何检查 SQL 中存在哪些列

How to check which columns exist in SQL

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

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'

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

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

如果 table 不存在,则此 returns 0。

希望对你有用

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

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

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

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