Tsql T-SQL:当为空时从备用表中选择列

Tsql T-SQL:当为空时从备用表中选择列,tsql,join,null,Tsql,Join,Null,我有下表,表A和数据: ID ColA 0 10 1 null 2 20 我有另一个表,TableB,包含以下数据 ID ColB ColC 1 30 80 1 40 70 3 50 100 我需要选择TableA中的行,但当行中的ColA为null时,我希望检索TableB中ColB的值(如果存在),并使用它代替ColA。如果ColB中不存在值,则结果中ColA的值应为null。连接是在TableA.

我有下表,表A和数据:

ID    ColA
0     10
1     null
2     20
我有另一个表,TableB,包含以下数据

ID    ColB   ColC
1     30     80
1     40     70 
3     50     100
我需要选择TableA中的行,但当行中的ColA为null时,我希望检索TableB中ColB的值(如果存在),并使用它代替ColA。如果ColB中不存在值,则结果中ColA的值应为null。连接是在TableA.ID和TableB.ID上完成的。TableB可以有多个ID列重复的行。TableB.ID和TableB.ColC一起构成了一个独特的行。因此,如果ColC的值被限制为70,我的结果应该是这样的:

ID   ColA
0     10 
1     40
2     20

不知道怎么做。谢谢你的帮助

如果我正确地解释了您的问题,这似乎符合您的要求:

SELECT  a.ID,
        ISNULL(a.ColA, b.ColB) ColA
FROM    TableA a
        LEFT JOIN
                TableB b
                ON a.ID = b.ID
                AND b.ColC = 70

正如您所说,我在ColC中的字面意思是“限制值为70”。

听起来您在寻找案例陈述。当TableA.Value为空时,请尝试使用
case,然后使用TableB.Value end

select a.ID, COALESCE(a.ColA, b.ColB) as 'ColA'
from TableA a
left join TableB b on a.ID = b.ID and b.ColC = 70

否,这将返回多个ID为1的行。你试过这个吗?@DavidM你是对的,如果我在
where子句
中做了,问题就解决了:)是的,所以你现在有了和我一样的,但是使用等效的
COALESCE
而不是
ISNULL
。“这会管用的。”戴维姆:的确,但我在5米前就把这个放进去了,你说它不管用:你的纠正是管用的。代码比其他代码少得多。万分感谢!不知道COALESCE函数。为什么在join中使用b.ColC而不是where?我只是好奇。他们的行为是否有所不同,或者这只是一种偏好?是的,他们有。如果在
WHERE
子句中,那么:如果在表B中有一个匹配行,其中ColC不是70,那么这不会出现在结果中。如果表B中没有匹配的行,则不会显示在结果中。酷。谢谢你的解释。我因为使用旧式连接而不是新的连接而被点名,所以我不知道这是否是其中之一抱歉,但这并没有给出结果。我完全按照您编写的方式运行了您的代码,ColA返回0,1,2