如果未找到A,请使用TSQL选择值B.

时间:2010-12-29 16:00:21

标签: sql tsql

我们有一个地址表,其中帐户的地址标记为“主要”或“送货”。

除非没有送货地址,否则我们要选择送货地址,在这种情况下,我们需要主要地址。

在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

4 个答案:

答案 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,如果ShippingAddressNULL,则会返回PrimaryAddress,除非PrimaryAddress也是NULL },在这种情况下,它只返回NULL

这是example page,可能会有所帮助。和MSDN page