微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Postregsql根据列值将一个检索到的记录转换为两个记录

如何解决Postregsql根据列值将一个检索到的记录转换为两个记录

我有两个Postgresql表:

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_astatus_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         |
+------------+------+---------+-----------+

解决方案吗?

解决方法

您需要使用searchesunion表透视成行。

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 举报,一经查实,本站将立刻删除。