如果一个为空,则SQL连接两列

时间:2014-06-16 15:48:55

标签: sql

我有一个具有不同地理分辨率的映射表。用户将数据输入到表中,我试图将数据表连接到映射表,条件是如果您可以加入zipcode值,那么如果zip不可用则加入,然后加入城市。

是否可以在联接中执行此操作?

3 个答案:

答案 0 :(得分:0)

我想在你的where子句中使用这样的东西:

WHERE a.ZipCode = ISNULL(b.ZipCode,a.ZipCode) AND a.City = ISNULL(b.City,a.City)

答案 1 :(得分:0)

根据您的数据,您可以在JOIN子句中使用OR

SELECT *
FROM a
JOIN b
ON a.Zip = b.Zip
  OR a.City = b.City

或将两个查询结合在一起

SELECT *
FROM a
JOIN b
ON a.Zip = b.Zip

UNION

SELECT *
FROM a
JOIN b
ON a.City = b.City
  AND a.Zip <> b.Zip

答案 2 :(得分:0)

WHERE (a.ZipCode IS NOT NULL AND b.ZipCode IS NOT NULL AND a.ZipCode = b.ZipCode) 
OR (a.ZipCode IS NULL OR b.ZipCode IS NULL) AND a.City = b.City

让我们分解一下:

 (a.ZipCode IS NOT NULL AND b.ZipCode IS NOT NULL AND a.ZipCode = b.ZipCode)

首先,我们需要确保zipcode都不是NULL(未知) 如果我们有2个zipcode,我们可以比较它们,如果没有,我们想比较城市:

OR (a.ZipCode IS NULL OR b.ZipCode IS NULL) AND a.City = b.City

这里我们确保至少有一个zipcodes为NULL(未知),否则我们更愿意比较zipcodes。然后我们比较城市。

您可以跳过第二部分中的NULL检查,并将where子句简化为:

WHERE (a.ZipCode IS NOT NULL AND b.ZipCode IS NOT NULL AND a.ZipCode = b.ZipCode) 
OR a.City = b.City

但是在这种情况下,它不会优先在城市上匹配ZipCode,例如:如果我们有一个ZipCode:1000和Name:Test的城市,另一个城市有ZipCode:2000,名称:Test .. it现在会认为它们是匹配的。

使用(INNER)JOIN时,在JOIN或WHERE子句中指定条件没有区别,所以这些:

SELECT ... FROM a JOIN b ON a.id=b.a_id

SELECT ... FROM a, b WHERE a.id=b.a_id

会产生相同的结果。