我们有一个地址表,其中帐户的地址标记为“主要”或“送货”。
除非没有送货地址,否则我们要选择送货地址,在这种情况下,我们需要主要地址。
在SqlServer 2005上使用TSQL的最佳方法是什么?
在下面的示例中,查询ID 1或2应该返回S记录。查询ID 2应该返回P记录。
请注意,还有其他可能的地址类型应该被忽略。
DECLARE @tmp TABLE(
ID int,
AddressType CHAR
)
INSERT INTO @tmp (ID,addresstype) VALUES (1,'P')
INSERT INTO @tmp (ID,addresstype) VALUES (1,'S')
INSERT INTO @tmp (ID,addresstype) VALUES (2,'P')
INSERT INTO @tmp (ID,addresstype) VALUES (2,'A')
SELECT * from @tmp
答案 0 :(得分:2)
这很讨厌,但确实有效:
select distinct t1.id,coalesce (t2.addresstype, t3.addresstype)
from @tmp t1
left join @tmp t2 on t1.id = t2.id and t2.addresstype = 'S'
left join @tmp t3 on t1.id = t3.id and t3.addresstype = 'P'
where t1.addresstype in ('P', 'S')
答案 1 :(得分:1)
而不是花哨的代码,只需依靠S
> P
集中限于P和S
SELECT
ID, MAX(AddressType)
FROM
@tmp
WHERE
AddressType IN ('P', 'S')
GROUP BY
ID
您也可以使用ROW_NUMBER或UNION或派生表。
如果您只想要一个ID,那么TOP更容易
SELECT TOP 1
ID, AddressType
FROM
@tmp
WHERE
AddressType IN ('P', 'S')
AND
ID = 2 --1
ORDER BY
AddressType DESC
这取决于您的用法:一个查询中的一个ID或多个ID
答案 2 :(得分:1)
假设您要在P或S
之间进行选择从@tmp中选择Top 1 * Where AddressType In('P','S')和ID = @id Order By AddressType Desc
答案 3 :(得分:1)
您在寻找 COALESCE 吗?它返回其参数中的第一个非null表达式。
例如,SELECT COALESCE(ShippingAddress, PrimaryAddress) FROM tableName
....
检索ShippingAddress
如果不是NULL
,如果ShippingAddress
是NULL
,则会返回PrimaryAddress
,除非PrimaryAddress
也是NULL
},在这种情况下,它只返回NULL
。
这是example page,可能会有所帮助。和MSDN page。