我多次使用过COALESCE,但我想我从未遇到过这种特殊情况。假设@ param1只有一行。
select @test = COALESCE (column1, 'default') FROM Table1 WHERE column3 = @param1
在这种情况下,如果column1的值为null,则在sql语句实际返回行时选择“default”。如果@ param1没有匹配的记录怎么办。
让我们说我希望@test总是有一个默认值。以下是正确的还是有另一种方式?
select @test = COALESCE( (select column1 FROM Table1 WHERE column3 = @param1), 'default').
我推测,select @test = COALESCE (column1, 'default') FROM Table1 WHERE column3 = @param1
,即使没有返回一行,也会包含'default'。不。
我想我之后也可以检查@test是否为NULL并同时指定默认值。
答案 0 :(得分:10)
您已经有效地提到了答案...在SELECT之后/之外使用COALESCE
,否则您实际上从未分配过一个值(与分配NULL值不同)......
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')
答案 1 :(得分:1)
你也可以在声明时给变量赋予默认值。如果查询没有返回任何行,则不会进行任何分配。
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