2016-11-09 34 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