所以我有一个潜在列的列表,我知道我可以检查某个列是否存在使用。
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'
答案 0 :(得分:1)
也许这段代码很有用(我确定必须有更好的解决方案):
select count(table_name) from all_tab_columns where column_name = 'YOUR_COLUMN';
对于多个colunm试试这个:
select count(table_name) from all_tab_columns where column_name in ( 'YOUR_COLUMN_1','YOUR_COLUMN_2')
如果表不存在,则返回0。
我希望对你有用
答案 1 :(得分:1)
在这里,我创建了一个包含单个列column_name
的表。我在column_name
架构中的表EMP
中测试了SCOTT
的存在。我假设所有表,列和模式名称都已经大写(因为所有目录字符串值都是大写的),否则您将需要不区分大小写的比较。此示例假定当前用户可以访问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 :(得分:0)
现在你得到了正确的答案,来到你的查询它会执行类似下面的事情,因为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