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

PostgreSQL中有这样一个简单的替代方法吗?

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

然后我testing查询是否返回任何东西,以certificate列存在。

我知道,使用psql我可以单独find这些,但是这是需要在我正在编写的程序中产生一个结果来validation我的数据库表中存在一个请求的属性字段。

尝试这个 :

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

接受的答案是正确的,但缺less模式和更好的输出(真/假):

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

PostgreSQL的对象标识符types更简单(和SQLi安全):

 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) 

阅读手册中列的重要性 。

如果您正在构builddynamicSQL,并且您的列名作为参数提供,则可能需要使用quote_ident()来避免SQL注入:

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

适用于search_path之外的表格:

 ... WHERE attrelid = 'mySchema.myTable'::regclass ... 
 SELECT attname FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'YOURTABLENAME') AND attname = 'YOURCOLUMNNAME'; 

当然,用适当的值replaceYOURTABLENAMEYOURCOLUMNNAME 如果返回一行,则存在该名称的列,否则不存在。

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

Oracle的user_tab_columns的相应标准视图是information_schema.columns

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

这里是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