如何解决Postregsql根据列值将一个检索到的记录转换为两个记录
Searches:
+----+------------+-----------+-----------+
| id | patient_id | status_a | status_b |
+----+------------+-----------+-----------+
| 1 | 1 | Added | Added |
+----+------------+-----------+-----------+
| 2 | 2 | Added | NULL |
+----+------------+-----------+-----------+
Patients:
+----+------+---------+
| id | name | country |
+----+------+---------+
| 1 | John | England |
+----+------+---------+
| 2 | Tim | France |
+----+------+---------+
我想检索“将status_a
或status_b
设置为“已添加”的所有患者,根据状态列的值创建不同的记录”。
我需要能够实现这一目标:
+------------+------+---------+-----------+-----------+
| patient_id | name | country | status_a | status_b |
+------------+------+---------+-----------+-----------+
| 1 | John | England | Added | NULL |
+------------+------+---------+-----------+-----------+
| 1 | John | England | Null | Added |
+------------+------+---------+-----------+-----------+
| 2 | Tim | France | Added | NULL |
+------------+------+---------+-----------+-----------+
或者,甚至更好:
+------------+------+---------+-----------+
| patient_id | name | country | status |
+------------+------+---------+-----------+
| 1 | John | England | A |
+------------+------+---------+-----------+
| 1 | John | England | B |
+------------+------+---------+-----------+
| 2 | Tim | France | A |
+------------+------+---------+-----------+
有解决方案吗?
解决方法
您需要使用searches
将union
表透视成行。
select p.id as patient_id,p.name,p.country,s.status
from patients p
join (select patient_id,'A' as status
from searches
where status_a is not null
union
select patient_id,'B' as status
from searches
where status_b is not null) as s
on s.patient_id = p.id
order by p.id,s.status;
,
我建议使用横向连接:
select s.patient_id,v.status_a,v.status_b
from searches s cross join lateral
(values (status_a,null),(null,status_b)
) v(status_a,status_b) join
patients p
on p.id = s.patient_id
where v.status_a is not null or v.status_b is not null;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。