CASE语句值检查

时间:2014-12-03 15:38:55

标签: sql db2

我有一个包含客户端地址的表。客户端可以有多个地址记录,我需要确定如何返回US,CAN或BOTH的值,具体取决于他们是在美国还是CAN中有地址,或者两个国家/地区都有地址。

我是在正确的轨道上,还是完全错误地想到了这一点?

SELECT A.CLNT_ID, CASE 
                WHEN (B.CNTRY_NAME = 'CANADA' AND B.CNTRY_NAME = 'UNITED STATES') THEN 'BOTH'
                WHEN (B.CNTRY_NAME = 'CANADA') THEN 'CAN'
                WHEN (B.CNTRY_NAME = 'UNITED STATES') THEN 'US'
              END
FROM CLNT_ADDR A
     ADDRESS B
WHERE A.CLNT_ID IN ('1111','2222','3333')
  WITH UR;

1 个答案:

答案 0 :(得分:0)

您需要使用聚合,因为客户端可以有多个地址。这会使用countcase来获得结果:

select c.clnt_id,
  case 
    when count(distinct a.cntry_name) = 2 then 'Both'
    when count(case when a.cntry_name = 'United States' then 1 end) > 0 then 'US'
    when count(case when a.cntry_name = 'Canada' then 1 end) > 0 then 'CA'
  end
from clnt_addr c
  left join address a on c.addr_id = a.addr_id
     and a.cntry_name in ('United States','Canada')
where c.clnt_id in ('1111','2222','3333')
group by c.clnt_id

另请注意,包括join。我猜测两个表中的连接字段都称为addr_id。根据您的预期结果,您可能需要outer join,也可能不需要{{1}}。