我有以下数据:
create temp table codes (id integer, code text);
insert into codes (id, code) values
(1, 'code_1'),
(1, 'code_2'),
(2, 'code_2'),
(3, 'code_1');
为了方便连接id字段的select,我想使用交叉表来旋转这个表,这样每个id值都是唯一的。到目前为止,我有这个设计,它适用于单个代码值:
select *
from crosstab($$
select id, code, case when code = 'code_1' then true else false end
from codes
order by 1,2
$$) as codes(id int, is_code_1 boolean);
正确输出:
id | is_code_1
----+-----------
1 | t
2 | f
3 | t
(3 rows)
我希望能够将其扩展为多个代码值,以便最终得到如下输出:
id | is_code_1 | is_code_2
----+-----------+-----------
1 | t | t
2 | f | t
3 | t | f
不确定这是可能的,但非常乐意另外学习。
修改: 这让我非常接近理想的结果,可以提供它作为答案,因为我可以用它来解决我的问题。感谢@DanielVérité链接到2参数交叉表。
select *
from crosstab(
$$
select id, code, case when code is not null then true else false end
from codes
order by 1,2
$$,
$$values ('code_1'), ('code_2')$$
) as codes(id int, code_1 boolean, code_2 boolean);
产地:
id | code_1 | code_2
----+--------+--------
1 | t | t
2 | | t
3 | t |
所以nulls而不是boolean false值,但我可以使用它。
答案 0 :(得分:0)
不确定我是否理解正确,但此代码可能会回答您的问题:
select *
from crosstab($$
select id, code, case when code = 'code_1' then true
when code = 'code_2' then true else false end
from codes
order by 1,2
$$) as codes(id int, is_code_1 boolean, is_code_2 boolean);