如果未找到A,则使用TSQL选择值B
我们有一个地址表,其中帐户的地址被标记为主地址或配送地址 我们希望选择发货地址,除非没有发货地址,在这种情况下,我们需要主地址 在SQLServer2005上使用TSQL的最佳方法是什么 在下面的示例中,查询ID 1或2应返回S记录。查询ID 2应返回P记录 注意,还有其他可能的地址类型应该忽略如果未找到A,则使用TSQL选择值B,sql,tsql,Sql,Tsql,我们有一个地址表,其中帐户的地址被标记为主地址或配送地址 我们希望选择发货地址,除非没有发货地址,在这种情况下,我们需要主地址 在SQLServer2005上使用TSQL的最佳方法是什么 在下面的示例中,查询ID 1或2应返回S记录。查询ID 2应返回P记录 注意,还有其他可能的地址类型应该忽略 DECLARE @tmp TABLE( ID int, AddressType CHAR ) INSERT INTO @tmp (ID,addresstype) VALUES (1,'P') IN
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
不要使用花哨的代码,只需在限制为p和S的集合中依赖
S
p
SELECT
ID, MAX(AddressType)
FROM
@tmp
WHERE
AddressType IN ('P', 'S')
GROUP BY
ID
您也可以使用行号、并集或派生表
如果您只需要一个ID,那么TOP就更容易了
SELECT TOP 1
ID, AddressType
FROM
@tmp
WHERE
AddressType IN ('P', 'S')
AND
ID = 2 --1
ORDER BY
AddressType DESC
这取决于您的用法:一个查询中的一个ID或多个ID而不是花哨的代码,只需在限制为p和S的集合中依赖
S
p
SELECT
ID, MAX(AddressType)
FROM
@tmp
WHERE
AddressType IN ('P', 'S')
GROUP BY
ID
您也可以使用行号、并集或派生表
如果您只需要一个ID,那么TOP就更容易了
SELECT TOP 1
ID, AddressType
FROM
@tmp
WHERE
AddressType IN ('P', 'S')
AND
ID = 2 --1
ORDER BY
AddressType DESC
它取决于您的用法:一个查询中有一个ID或多个ID假设您想在p或S之间进行选择
从@tmp中选择顶部1*,其中AddressType In('p','S'),ID=@ID Order By AddressType Desc假设您想在p或S之间进行选择
从@tmp中选择顶部1*,其中AddressType In('p','S')和ID=@ID Order By AddressType Desc您正在寻找合并吗?它返回其参数中的第一个非空表达式 例如,
从tableName
中选择COALESCE(ShippingAddress,PrimaryAddress)。。。。
检索ShippingAddress
如果它不是NULL
,如果ShippingAddress
是NULL
,它将返回PrimaryAddress
,除非PrimaryAddress
也是NULL
,在这种情况下它只返回NULL
下面是一个可能有用的例子。还有 您是否正在寻找合并?它返回其参数中的第一个非空表达式 例如,
从tableName
中选择COALESCE(ShippingAddress,PrimaryAddress)。。。。
检索ShippingAddress
如果它不是NULL
,如果ShippingAddress
是NULL
,它将返回PrimaryAddress
,除非PrimaryAddress
也是NULL
,在这种情况下它只返回NULL
下面是一个可能有用的例子。还有 这很糟糕,但它是有效的:
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')
这很糟糕,但它是有效的:
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')
例如,如果有一个地址类型为X,这难道不会失败吗?@vlad:Question说“注意,还有其他可能的地址类型应该被忽略。”因此,我们必须假设S或P中有一个存在,否则问题是无效的。我们想到了这一点,但如果在S和P之间添加一个新的地址类型,它将破坏它。@Kenoyer130:因此,在('P','S')中对
地址类型进行筛选,因此聚合中只有这两个值。这表明你还有其他可能被忽略的地址类型。对不起,我误读了原来的问题,并认为它不应该被忽略。如果地址类型是X,这不会失败吗?@vlad:question说“注意,还有其他可能被忽略的地址类型。”因此,我们必须假设S或P中有一个存在,否则问题是无效的。我们想到了这一点,但如果在S和P之间添加一个新的地址类型,它将破坏它。@Kenoyer130:因此,在('P','S')
中对地址类型进行筛选,因此聚合中只有这两个值。这说明还有其他可能的地址类型应该被忽略。我很抱歉,我误解了原来的问题,并认为它不应该被忽略。假设有两列或一个自连接,你可以在合并参数中放入任意多的列。我应该说“给我们一个例子”而不是在没有任何上下文或示例的情况下提及联合。我确实有一些关于SQL的线索-1由于缺乏对以下内容的解释或示例:usage@gbn我被你的评论和否决票弄糊涂了。单词“例如”后的SQL是我的示例,它基于一些假定的包含地址的表,而不是上面的临时表,临时表不包含地址,并且可能不需要完成提问者的目标。接受的答案也使用COALESCE。表中有一列。这是如何与COALESCE一起工作的?你的例子毫无意义。接受的答案使用了我在这里的第一条评论中提到的自连接。这假设有两列或一个自连接。您可以在COALESCE参数中放入任意多的列。我应该说“给我们一个示例”,而不是在没有任何上下文或示例的情况下提及COALESCE。我确实有一些关于SQL的线索-1由于缺乏对以下内容的解释或示例:usage@gbn我被你的评论和否决票弄糊涂了。单词“例如”后的SQL是我的示例,它基于一些假定的包含地址的表,而不是上面的临时表,临时表不包含地址,并且可能不需要完成提问者的目标。接受的答案也使用COALESCE。表中有一列。这是如何与COALESCE一起工作的?你的例子毫无意义。被接受的答案使用了我在这里的第一条评论中提到的自连接。