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 查找列中不同值的数量仅讨论固定列。
一般来说,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 中,那么您将不得不求助于一种集成的过程语言。对这些问题的精彩(尽管复杂)讨论可能会提供指导。
| 归档时间: |
|
| 查看次数: |
5483 次 |
| 最近记录: |