gpt4 book ai didi

PostgreSQL 9.3 :Dynamic Cross tab query

转载 作者:行者123 更新时间:2023-11-29 12:20:35 24 4
gpt4 key购买 nike

我是 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,A3A5

如果用户通过 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

关于PostgreSQL 9.3 :Dynamic Cross tab query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27119413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com