PostgreSQL-选择不存在特定列的表
我有一个模式,在一个PostgreSQL数据库中有大约3000个表,所有表都有一行和以下列: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
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…
表达式