如何根据列值在SQL中过滤行

时间:2018-08-21 12:55:36

标签: sql-server

我正在执行一个SQL查询(SQL Server Managmenet Studio),该查询生成一个地址列表。一方可以有两种地址:

  • 实际地址
  • 通讯地址

我希望查询以下内容。如果该方有通讯地址,则仅应选择该地址,否则(即无通讯地址)应选择具有实际地址的行。结果是,对于每一方,只能选择一个地址。

我现在拥有的查询包含很多联接,因为当事方在贷款上扮演角色,但可以简化为:

SELECT Party.Name, Address.AddressLine 
FROM Party
LEFT OUTER JOIN Address on (Party.AddressID = Address.ObjID)

表Address包含一列UsageID,分别为PhysicalAddress和CorrespondenceAddress的值分别为1和2。

我将如何实现这一目标? 提前致谢。

2 个答案:

答案 0 :(得分:0)

以下是使用row_number()的一种选择:

select * 
from (
    select p.Name, a.AddressLine, 
           row_number() over (partition by p.name order by a.usageid desc) rn
    from Party p 
        left join Address a on p.AddressID = a.ObjID
) t
where rn = 1

如果存在任何地址,它将返回usageid desc的第一个顺序,如果存在,则应该首先返回CorrespondenceAddress

答案 1 :(得分:0)

根据我的理解,

create table #party(id int identity(1,1), pAddr int, cAddr int)

create table #addr (id int identity(1,1), name varchar(1))

insert into #party(pAddr,cAddr) values (3,null), (1,1),(2,8),(3,3),(4,null),(4,5)

insert into #addr(name) values ('a'),('e'),('d'),('g')



select p.id
, case when p.cAddr is not null then p.cAddr   -- Here, checking whether,
  else p.pAddr                                 -- the corresponding address is null or not. 
  end Addresses
, name
 from #party p
join #addr a
on p.id = a.id

感谢您回复,如果查询需要任何更新... !!