2014-11-25 67 views
2

我真的很新,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,A3A5

如果用戶通過A1那麼結果應該是:

cola A1 
---------- 
401 1 

注意:在上述結果的記錄401出現,因爲它只能屬於A1

我不明白如何在此方案的函數內編寫交叉表。

+0

參考此答案http://stackoverflow.com/questions/3002499/postgresql-crosstab-query/11751905#11751905 – 2014-11-25 06:04:48

回答

1

服務器端函數在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