Postgresql Postgres:查找每列的不同值的数量

Postgresql Postgres:查找每列的不同值的数量,postgresql,dynamic-sql,Postgresql,Dynamic Sql,我试图在表的每一列中找到不同值的数量。声明性地说,即: for each column of table xyz run_query("SELECT COUNT(DISTINCT column) FROM xyz") 显示查找表的列名 但是,我无法在内部合并计数查询。我尝试了各种查询,这一个: SELECT column_name, thecount FROM information_schema.columns, (SELECT COUNT(DISTINCT column

我试图在表的每一列中找到不同值的数量。声明性地说,即:

for each column of table xyz
run_query("SELECT COUNT(DISTINCT column) FROM xyz")      
显示查找表的列名

但是,我无法在内部合并计数查询。我尝试了各种查询,这一个:

SELECT column_name, thecount
FROM information_schema.columns, 
   (SELECT COUNT(DISTINCT column_name) FROM myTable) AS thecount
WHERE table_name=myTable
语法上不允许(不允许在嵌套查询中引用列_name)

这一条似乎也有错误(超时):

使用一个查询获取表中每列的不同值的正确方法是什么


本文只讨论固定列。

一般来说,SQL希望语句中的项(字段、表、角色、索引、约束等)的名称是常量。许多数据库系统允许您通过类似信息模式的方式检查结构,但这并不意味着您可以将该数据插入正在运行的语句中

但是,您可以使用信息模式来构造单独执行的新SQL语句

首先考虑你原来的问题。

CREATE TABLE foo (a numeric, b numeric, c numeric);

INSERT INTO foo(a,b,c)
     VALUES (1,1,1), (1,1,2), (1,1,3), (1,2,1), (1,2,2);

SELECT COUNT(DISTINCT a) "distinct a",
       COUNT(DISTINCT b) "distinct b",
       COUNT(DISTINCT c) "distinct c"
  FROM foo;
如果在编写查询时知道所有列的名称,就足够了

如果要查找任意表的数据,则需要通过SQL构造SQL语句(我添加了大量空格,以便您可以看到所涉及的不同级别):

然而,这只是必要的SQL语句的文本。根据您访问Postgresql的方式,您可能很容易将其输入到新的查询中,或者如果您将所有内容都保存在Postgresql中,那么您将不得不求助于一种集成的过程语言。一个优秀的(尽管很复杂)模型可以提供指导

SELECT column_name, count(distinct column_name) 
FROM information_schema.columns, myTable
WHERE table_name=myTable
CREATE TABLE foo (a numeric, b numeric, c numeric);

INSERT INTO foo(a,b,c)
     VALUES (1,1,1), (1,1,2), (1,1,3), (1,2,1), (1,2,2);

SELECT COUNT(DISTINCT a) "distinct a",
       COUNT(DISTINCT b) "distinct b",
       COUNT(DISTINCT c) "distinct c"
  FROM foo;
SELECT 'SELECT ' || STRING_AGG(   'COUNT (DISTINCT '
                               || column_name
                               || ') "'
                               || column_name
                               || '"',
                               ',')
                 || ' FROM foo;'
  FROM information_schema.columns
 WHERE table_name='foo';