Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果未找到A,则使用TSQL选择值B_Sql_Tsql - Fatal编程技术网

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

如果未找到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

我们有一个地址表,其中帐户的地址被标记为主地址或配送地址

我们希望选择发货地址,除非没有发货地址,在这种情况下,我们需要主地址

在SQLServer2005上使用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

不要使用花哨的代码,只需在限制为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一起工作的?你的例子毫无意义。被接受的答案使用了我在这里的第一条评论中提到的自连接。