PostgreSQL-选择不存在特定列的表

PostgreSQL-选择不存在特定列的表,sql,database,postgresql,select,Sql,Database,Postgresql,Select,我有一个模式,在一个PostgreSQL数据库中有大约3000个表,所有表都有一行和以下列: id,区域,使用,geom,站点id 但是,我刚刚发现,至少有一个表遗漏了列site\u id。我想知道是否还有更多的。。如何查询没有列site\u id的表 我下面的想法行不通。有什么建议吗 SELECT table_name FROM information_schema.columns WHERE table_schema = 'schema_A' AND column_name NOT LIK

我有一个模式,在一个PostgreSQL数据库中有大约3000个表,所有表都有一行和以下列:

id
区域
使用
geom
站点id

但是,我刚刚发现,至少有一个表遗漏了列
site\u id
。我想知道是否还有更多的。。如何查询没有列
site\u id
的表

我下面的想法行不通。有什么建议吗

SELECT table_name
FROM information_schema.columns 
WHERE table_schema = 'schema_A' AND column_name NOT LIKE 'site_id'
GROUP BY table_name;

一种简单的方法是计算
side\u id
在该表的列列表中出现的次数。如果总和为零,则该表没有
站点id

SELECT table_name
FROM information_schema.columns 
WHERE table_schema = 'schema_A'
GROUP BY table_name
HAVING SUM(CASE WHEN column_name LIKE 'site_id' THEN 1 ELSE 0 END) = 0;

我也不确定这是否是故意的,但是像'site\u id'这样的
会产生与
='site\u id'
相同的效果。如果您想检查它是否包含
site\u id
,那么像“%site\u id%”这样的
更合适。

一个简单的方法是计算
side\u id
在该表的列列表中出现的次数。如果总和为零,则该表没有
站点id

SELECT table_name
FROM information_schema.columns 
WHERE table_schema = 'schema_A'
GROUP BY table_name
HAVING SUM(CASE WHEN column_name LIKE 'site_id' THEN 1 ELSE 0 END) = 0;

我也不确定这是否是故意的,但是像'site\u id'
这样的
会产生与
='site\u id'
相同的效果。如果您想检查它是否包含
site\u id
比如“%site\u id%”
会更合适。

我想这是为了精确地比较列名和文本
site\u id
…@andrasz:No HAVING子句过滤器,您可以根据SELECT列表获得表名。试一试——我试过了;-)(OP的评论被否定了)@Dilettant:是的,你是对的:我只是在寻找“site_id”,是的,它是有效的。在尝试了代码之后,我所有描述(现在已删除)的怀疑都消失了;)谢谢你,骆驼先生!从Postgres 9.4开始,您可以将
SUM(CASE…
表达式替换为
COUNT(*)过滤器(其中列名称类似“site\u id”)
我想这是为了将列名与文本
site\u id
进行精确比较…@andrasz:不,如果有子句过滤器,则根据选择列表获得表名。试一试——我试过了;-)(OP的评论被否定了)@Dilettant:是的,你是对的:我只是在寻找“site_id”,是的,它是有效的。在尝试了代码之后,我所有描述(现在已删除)的怀疑都消失了;)谢谢你,骆驼先生!从Postgres 9.4开始,您可以用
COUNT(*)过滤器(其中列名称如“site\u id”)替换
SUM(CASE…
表达式