PostgreSQL中如何基于同表同一列生成不同输出列并返回NULL值
解决方案
针对你的需求,不需要用内连接,用条件聚合或者独立子查询就能直接获取目标结果,且无符合条件数据时自动返回NULL,以下是两种可行的SQL写法:
方法一:条件聚合(推荐)
通过CASE语句匹配条件,结合聚合函数(如MAX/MIN)提取对应日期,聚合函数在无匹配数据时会返回NULL,正好满足需求:
SELECT MAX(CASE WHEN employee_type = 'Intern' THEN joining_date END) AS date1, MAX(CASE WHEN employee_type = 'manager' THEN joining_date END) AS date2, MAX(CASE WHEN employee_type = 'senior' AND name = 'ABcS' THEN joining_date END) AS date3 FROM employee;
结果说明
date1:返回所有Intern类型员工中最新的入职日期(若有多个),无匹配则返回NULLdate2:返回manager类型员工的入职日期,无匹配则返回NULLdate3:返回符合senior且name='ABcS'的员工入职日期,无匹配则返回NULL
针对你的测试数据,执行后会得到:
| date1 | date2 | date3 |
|---|---|---|
| 2022-12-11 | 2022-12-11 | 2022-11-11 |
方法二:独立子查询
每个日期单独通过子查询获取,无匹配时返回NULL:
SELECT (SELECT joining_date FROM employee WHERE employee_type = 'Intern' LIMIT 1) AS date1, (SELECT joining_date FROM employee WHERE employee_type = 'manager' LIMIT 1) AS date2, (SELECT joining_date FROM employee WHERE employee_type = 'senior' AND name = 'ABcS') AS date3;
注意事项
- 子查询中加
LIMIT 1是为了避免多个匹配结果时返回多行错误;若需要所有匹配日期,可替换为ARRAY_AGG(joining_date) - 此写法会为每个日期单独查询一次表,数据量较大时性能不如条件聚合
为什么内连接没返回数据?
内连接要求关联的结果集必须有匹配记录,但你的需求是提取三个独立条件的结果,它们之间没有必然关联,用内连接会因无共同匹配记录导致返回空集,因此不适合用内连接实现该需求。
内容的提问来源于stack exchange,提问作者codeanonym
相关产品推荐
相关产品推荐

