PostgreSQL 9.3:动态跨标签查询
问题描述:
我真的很新,PostgreSQL使用的版本是9.3。PostgreSQL 9.3:动态跨标签查询
嗯,我有以下表中的一些记录:
例:
create table tst
(
cola varchar(10),
colc varchar(10)
)
insert into tst values('101','A1');
insert into tst values('101','A2');
insert into tst values('201','A3');
insert into tst values('301','A4');
insert into tst values('401','A1');
insert into tst values('101','A6');
insert into tst values('201','A1');
insert into tst values('201','A5');
注意:现在我想只显示其中cola
属于colc
的值的记录。如果用户将colc
作为参数值传递给函数,那么它必须匹配colc
的确切值,它属于哪个值,即cola
。
预期结果:
如果用户通过A1,A2,A6
那么结果应该是:
cola A1 A2 A6
--------------------
101 1 1 1
注意:在上述结果的记录101
出现,因为它属于A1,A2,A6
没有其他值。 201
不会出现,因为它也属于A1,A3
和A5
。
如果用户通过A1
那么结果应该是:
cola A1
----------
401 1
注意:在上述结果的记录401
出现,因为它只能属于A1
。
我不明白如何在此方案的函数内编写交叉表。
答
服务器端函数在PostgreSQL中不能有一个动态返回类型,因此不可能从固定函数获得上述结果。
另外,无论如何,它看起来都不像一个典型的交叉表问题。输出的cola
部分可以通过对聚合进行过滤来获得,而其他列A1/A2/A6
实际上是输入,因此在客户端生成的查询的上下文中将它们作为列复制到输出中很容易。
实际的SQL查询找到匹配的行会的要点:
select cola from ts
group by cola
having array_agg(colc order by colc)='{A1,A2,A6}'
这将找到101
。
添加其他列仅仅是一个客户端演示问题。例如,查询可以这样写:
select cola, 1 as A1, 1 as A2, 1 as A6 from tst
group by cola
having array_agg(colc order by colc)='{A1,A2,A6}';
结果:
cola | a1 | a2 | a6
------+----+----+----
101 | 1 | 1 | 1
参考此答案http://stackoverflow.com/questions/3002499/postgresql-crosstab-query/11751905#11751905 – 2014-11-25 06:04:48