Tsql T-SQL:当为空时从备用表中选择列
我有下表,表A和数据: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.
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