if和else在sql中的select查询中

时间:2014-11-20 19:36:22

标签: sql oracle

我有两个表,其中包含people_table中的员工信息 和一个电话没有。这些员工现在,phone_table可以为具有不同类型的特定员工提供多个条目,例如W1 - > Work,M - > Mobile,H1 - > Home。 现在我想要查询,如果W1被激活,则不应该获取其他电话类型。如果W1没有被激活,那么应该检查M并且查询应该取代移动号码(依此类推等等)所以基本上我必须在select语句中使用if和else。我无法根据要求为此编写函数。

我尝试使用Case,如下所示: -

select emp_num, emp_name,ph_no,ph_type,
case 
  when ph_type='W1'
then ph_no
  when ph_type='M'
then ph_no

from people_table pt ,phone_table ppt
where pt.person_id=ppt.person_id

但这也是返回相同的输出。如果一个wmployee有w1没有。而且没有。它将返回两个..但它应该取W1否。只有而不是M

2 个答案:

答案 0 :(得分:4)

听起来你需要两次加入电话表的过滤集:

select 
    emp_num, 
    emp_name,
    ph_no,
    COALESCE(ppt_w.ph_type,ppt_m.ph_type) ph_type,
    COALESCE(ppt_w.ph_no,ppt_m.ph_no) ph_no
from people_table pt 
LEFT JOIN phone_table ppt_w
  ON pt.person_id=ppt_w.person_id
     AND ppt_w.ph_type='W1'
LEFT JOIN phone_table ppt_m
  ON pt.person_id=ppt_m.person_id
     AND ppt_m.ph_type='M'

答案 1 :(得分:1)

您可以执行左连接以获取电话号码,并coalesce获取存在的第一个电话号码:

select
  p.emp_num,
  p.emp_name,
  coalesce(w1.ph_no, m.ph_no, h1.ph_no) as ph_no,
  coalesce(w1.ph_type, m.ph_type, h1.ph_type) as ph_type
from
  people_table p
  left join phone_table w1 on w1.person_id = p.person_id and w1.ph_type = ''
  left join phone_table m on m.person_id = p.person_id and m.ph_type = ''
  left join phone_table h1 on h1.person_id = p.person_id and h1.ph_type = ''