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

Postgresql 如何使用SQL语句测试表中是否存在列,postgresql,information-schema,Postgresql,Information Schema,在PostgreSQL中是否有一个简单的替代方法来替代Oracle中生成的这条语句 select table_name from user_tab_columns where table_name = myTable and column_name = myColumn; 然后,我测试查询是否返回任何内容,以证明该列存在 我知道使用psql我可以单独找到这些,但这是在我正在编写的程序中生成结果所必需的,以验证数据库表中是否存在请求的属性字段 SELECT attname FROM pg_at

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

select table_name from user_tab_columns
where table_name = myTable and column_name = myColumn;
然后,我测试查询是否返回任何内容,以证明该列存在

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

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

当然,用正确的值替换YOURTABLENAMEYOURCOLUMNNAME。如果返回一行,则具有该名称的列存在,否则不存在。

与Oracle不同,PostgreSQL支持ANSI标准的
信息模式视图

Oracle用户选项卡列对应的标准视图是
information\u schema.columns

试试这个:

SELECT column_name 
FROM information_schema.columns 
WHERE table_name='your_table' and column_name='your_column';
这对于PostgreSQL来说更简单(而且SQLi安全):

阅读关于这个问题的文章

如果您正在构建动态SQL,并且您的列名作为参数提供,则可能希望使用以避免SQL注入:

...
AND    attname = quote_ident('myColumn');
也适用于
搜索路径
之外的表:

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

接受的答案是正确的,但缺少架构和更好的输出(真/假):


这是埃尔文·布兰德斯特特回答的类似变体。 这里我们也检查模式,以防在不同的模式中有相似的表

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

谢谢被接受为答案,因为这是我在Oracle中所做工作的直接替代品。@csharpend对Oracle的查询是什么?这是一个非常脆弱的答案-例如,。如果名为
your\u table
的表出现在
schema
中,该schema位于
search\u path
的较高位置。我的PostGIS数据库有每月一次的模式,每个模式都有相同的表名;使用此答案,
vicmap201208.address
将在
vicmap201910.address
之前找到,因为
vicmap201208
出现在
vicmap201910
搜索路径上的
。[碰巧,各个模式中的列名都是常量:这不是重点]感谢您的响应。虽然你的例子很好用,但我还是选择接受Ramandeeps的答案,因为它很简单,而且它似乎是我问题的一个更直接的替代方案。还考虑了模式或只是
SELECT true as exists FROM information_schema.columns WHERE
SELECT EXISTS (SELECT 1 
FROM information_schema.columns 
WHERE table_schema='my_schema' AND table_name='my_table' AND column_name='my_column');
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