如何使用 SQL 语句测试表中是否存在列

PostgreSQL 中是否有一个简单的替代 Oracle 生成的这个语句的方法?

select table_name from user_tab_columns
where table_name = myTable and column_name = myColumn;

然后测试查询是否返回任何内容,以证明该列的存在。

我知道使用 psql 可以单独查找这些属性,但是这是在我正在编写的程序中生成结果所必需的,以验证数据库表中是否存在所请求的属性字段。

110427 次浏览
SELECT attname
FROM pg_attribute
WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'YOURTABLENAME')
AND attname = 'YOURCOLUMNNAME';

当然,用适当的值替换 你的桌子你的专栏名称。如果返回一行,则存在具有该名称的列,否则不存在该列。

与 Oracle 不同,PostgreSQL 支持 ANSI 标准 INFORMATION_SCHEMA视图。

Oracle 的 user _ tab _ column 的相应标准视图是 information_schema.columns

Http://www.postgresql.org/docs/current/static/infoschema-columns.html

试试这个:

SELECT column_name
FROM information_schema.columns
WHERE table_name='your_table' and column_name='your_column';

使用 PostgreSQL 的 对象标识符类型:

SELECT true
FROM   pg_attribute
WHERE  attrelid = 'myTable'::regclass  -- cast to a registered class (table)
AND    attname = 'myColumn'
AND    NOT attisdropped  -- exclude dropped (dead) columns
-- AND attnum > 0        -- exclude system columns (you may or may not want this)

系统目录的查询速度比众所周知的令人费解的 information_schema快很多倍(但对于单个查询仍然只有几毫秒)。参见:

读读 手册中栏目的重要性

在使用列名作为参数构建动态 SQL 时,使用 quote_ident()防止 SQL 注入:

...
AND    attname = quote_ident('myColumn');

也适用于 search_path以外的桌子:

...
WHERE  attrelid = 'mySchema.myTable'::regclass
...

接受的答案是正确的,但是缺少模式和更好的输出(True/False) :

SELECT EXISTS (SELECT 1
FROM information_schema.columns
WHERE table_schema='my_schema' AND table_name='my_table' AND column_name='my_column');

下面是 Erwin Brandstetter 的类似答案。 这里我们也检查模式,以防在不同的模式中有相似的表。

SELECT TRUE FROM pg_attribute
WHERE attrelid = (
SELECT c.oid
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE
n.nspname = CURRENT_SCHEMA()
AND c.relname = 'YOURTABLENAME'
)
AND attname = 'YOURCOLUMNNAME'
AND NOT attisdropped
AND attnum > 0