如何检查 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
所以我有一个潜在列的列表,我知道我可以使用以下方法检查某个列是否存在。
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