2016-11-09 46 views
0

我有以下SQL语句:在合并三列到一个

SELECT p.id, p.first_name, p.last_name, a.admitted_at, 
     a.discharged_at, c.name as client_name, p.receive_reminders, 
     p.opt_in_to_receive_reminders, u.phone_number, p.status, 
     c.id as client_id, p.mrn 
    FROM patients p 
    LEFT JOIN admissions a ON p.last_admission_id = a.id 
    INNER JOIN facilities f ON f.id = p.facility_id 
    INNER JOIN clients c ON c.id = f.client_id 
    LEFT OUTER JOIN users u ON p.user_id = u.id; 

我有三列:

p.opt_in_to_receive_reminders - boolean 
u.phone_number - string 
p.receive_reminders - boolean 

我想这3列的结果结合起来,一个虚拟列 - messaging。例如,如果p.opt_in_to_receive_reminders为真,并且u.phone_number不为空,并且p.receive_reminders为真,那么此列将具有真值,在其他情况下它将返回false。

我该如何在PostgreSQL中做到这一点?

+1

有你看到' CASE' expresion? –

回答

3

就这样写:

p.opt_in_to_receive_reminders是真实的,如果u.phone_number是不是空的,p.receive_reminders是真的

select p.opt_in_to_receive_reminders and u.phone_number is not null and p.receive_reminders 
-- or 
select p.opt_in_to_receive_reminders and u.phone_number <> '' and p.receive_reminders 
-- or 
select p.opt_in_to_receive_reminders and coalesce(u.phone_number, '') is null and p.receive_reminders 
+0

如果phone_number为空,这两个表达式都不能正常工作。一个更安全的表达式将是SELECT p.opt_in_to_receive_reminders AND COALESCE(u.phone_number,'')<>''AND p.receive_reminders AS messaging,... FROM patients p ... –

+0

谢谢。 OP没有具体说明它是什么意思* empty *。第一个变体是空值,第二个变量是不可空的。当然,如果两种情况都是可能的,'coalesce()'是必须的。 – klin