sql - 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_a
ORstatus_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;
推荐阅读
- javascript - 从模块类型的另一个脚本访问变量
- php - 如果请求 wp-admin,Apache 重写规则以停止重定向
- reactjs - 从 React 中的单独组件更新状态
- python - 如何将图像切成 9 部分,然后将裁剪图像保存到特定文件夹中?(在蟒蛇中)
- amazon-web-services - 无法使用 Cloudformation 创建 KMS
- php - 如何检查序列化表单是否包含文件输入
- c# - sortby thenby 未按预期排序
- javascript - 选择下拉列表时显示第二个下拉列表
- jquery - Jquery -> 条件查询
- linux - 在 net core webapp 中,使用 libreoffice ,错误:libreoffice: dirname: not found