Sql 对未返回行使用合并

Sql 对未返回行使用合并,sql,sql-server-2008,Sql,Sql Server 2008,我已经多次使用COALESCE,但我想我从未遇到过这种特殊情况。假设每个@param1只有一行 select @test = COALESCE (column1, 'default') FROM Table1 WHERE column3 = @param1 在这种情况下,如果column1的值为null,则当sql语句实际返回一行时,将选择“default”。如果@param1没有匹配的记录怎么办 select @test = COALESCE (column1, 'default') FRO

我已经多次使用COALESCE,但我想我从未遇到过这种特殊情况。假设每个@param1只有一行

select @test = COALESCE (column1, 'default') FROM Table1 WHERE column3 = @param1
在这种情况下,如果column1的值为null,则当sql语句实际返回一行时,将选择“default”。如果@param1没有匹配的记录怎么办

select @test = COALESCE (column1, 'default') FROM Table1 WHERE column3 = @param1
假设我希望@test始终有一个默认值。以下是正确的还是有其他方法

选择@test=COALESCE从表1中选择column1,其中column3=@param1,“default”

我假设,从表1中选择@test=COALESCE column1,'default',其中column3=@param1将包含'default',即使它没有返回行。没有


我想我也可以在事后检查@test是否为NULL,并指定一个默认值。

您已经有效地提到了答案。。。在SELECT之后/之外使用COALESCE,否则您永远不会实际指定与指定空值不同的值

SELECT @test = NULL
SELECT @test = column1 FROM Table1 WHERE column3 = @param1
SELECT @test = COALESCE(@test, 'default')
或者干脆

SELECT @test = COALESCE((SELECT column1 FROM Table1 WHERE column3 = @param1), 'default')

您也可以在声明时为变量指定默认值。如果查询未返回任何行,则不会进行分配

DECLARE @test VARCHAR(10) = 'default'

SELECT  @test = COALESCE(column1, @test) /*Might not need COALESCE 
                                           if column1 is not nullable*/
FROM    Table1
WHERE   column3 = @param1 

SELECT  @test

NULL是未知的。空结果=完全没有价值。我的车里有多少只鞋?答案可能是空的,除非你躲在我的车库里,因为你不可能知道我的车里有多少只鞋——假设我有一辆车。如果我没有车,答案不是空的,而是空的。@aaron,我想这是我今天听到的最糟糕的类比之一。我认为情况正好相反。如果你有一辆车,那么车里有0或x数量的鞋子。它不是空的。但是如果你根本没有车,它是空的,因为来源不存在,这个问题是无效的。这取决于视角。如果我问你我的车里有多少只鞋,你真的能自信地说0或x吗?不,你只能回答未知的问题。如果我没有车,SELECT*FROM car INNER JOIN shoe返回的不是空集,不是NULL或0吗?您不能说问题无效,您已经运行了查询。SQL Server不会抱怨您的问题无效,它只是返回一个空集。对不起,我当时误解了。但是,如果您试图将shoes的值分配给一个变量,则该变量将为“未知”,而不管qurey返回的是空集还是“未知”。是的,请从表1中选择column1,其中column3=@param1可以生成空集。是的,这意味着从表1中选择@var=column1,其中column3=@param1从不为@var赋值。然而,从表1中设置@var=SELECT column1,其中column3=@param1确实为@var赋值。这里的作用机制更多地与SELECT如何处理赋值有关。从表1中选择@var=column1实际上是将每个值赋给@var,尽管您只能看到最后一个赋值。这就是为什么从表中选择@total=@total+val在许多情况下都有效。您的第二个选项与我在问题中的选项相同,对吗?