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

7on*_*7on 5 postgresql dynamic-sql

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

for each column of table xyz
run_query("SELECT COUNT(DISTINCT column) FROM xyz")      
Run Code Online (Sandbox Code Playgroud)

此处显示查找表的列名。

SELECT column_name 
FROM information_schema.columns
WHERE table_name=xyz
Run Code Online (Sandbox Code Playgroud)

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

SELECT column_name, thecount
FROM information_schema.columns, 
   (SELECT COUNT(DISTINCT column_name) FROM myTable) AS thecount
WHERE table_name=myTable
Run Code Online (Sandbox Code Playgroud)

语法上不允许(不允许在嵌套查询中引用 column_name)。

这似乎也是错误的(超时):

SELECT column_name, count(distinct column_name) 
FROM information_schema.columns, myTable
WHERE table_name=myTable
Run Code Online (Sandbox Code Playgroud)

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

文章SQL 查找列中不同值的数量仅讨论固定列。

gwa*_*igh 3

一般来说,SQL 期望语句中的项目名称(字段、表、角色、索引、约束等)保持不变。许多数据库系统允许您通过 information_schema 之类的东西检查结构,但这并不意味着您可以将该数据插入正在运行的语句中。

但是,您可以使用 information_schema 构造单独执行的新 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;
Run Code Online (Sandbox Code Playgroud)

如果您在编写查询时知道所有列的名称,那就足够了。

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

SELECT 'SELECT ' || STRING_AGG(   'COUNT (DISTINCT '
                               || column_name
                               || ') "'
                               || column_name
                               || '"',
                               ',')
                 || ' FROM foo;'
  FROM information_schema.columns
 WHERE table_name='foo';
Run Code Online (Sandbox Code Playgroud)

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