我试图在表的每列中找到不同值的数量。声明性地说:
for each column of table xyz
run_query("SELECT COUNT(DISTINCT column) FROM xyz")
查找表的列名称显示为here。
SELECT column_name
FROM information_schema.columns
WHERE table_name=xyz
但是,我没有设法合并内部的计数查询。我尝试了各种查询,这一个:
SELECT column_name, thecount
FROM information_schema.columns,
(SELECT COUNT(DISTINCT column_name) FROM myTable) AS thecount
WHERE table_name=myTable
在语法上是不允许的(不允许在嵌套查询中引用column_name)。
这个似乎也是错误的(超时):
SELECT column_name, count(distinct column_name)
FROM information_schema.columns, myTable
WHERE table_name=myTable
使用一个查询获取表的每列的不同值的数量的正确方法是什么?
文章SQL to find the number of distinct values in a column仅讨论固定列。
答案 0 :(得分:0)
通常,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;
如果您在编写查询时知道所有列的名称,那就足够了。
如果您正在寻找任意表的数据,您需要通过SQL构造SQL语句(我添加了大量的空格,以便您可以看到涉及的不同级别):
SELECT 'SELECT ' || STRING_AGG( 'COUNT (DISTINCT '
|| column_name
|| ') "'
|| column_name
|| '"',
',')
|| ' FROM foo;'
FROM information_schema.columns
WHERE table_name='foo';
然而,这只是必要的SQL语句的文本。根据您访问Postgresql的方式,可能很容易将其提供给新查询,或者如果您将所有内容保存在Postgresql中,那么您将不得不求助于其中一种集成的过程语言。优秀(尽管很复杂)discussion of the issues可能会提供指导。