SQL Server - 比较同一个表中的值

时间:2016-10-06 16:33:41

标签: sql sql-server

在SQL Server中,我有一个包含以下数据的表(tblUserSettings):

| CountryID | CityID  | UserType | Value1 | Value2 | Value3 |
| 9         | 3       | 1        | 5      | 5      | 5      |
| 9         | 3       | 2        | NULL   | NULL   | NULL   |
| 9         | 3       | 3        | 5      | 5      | 5      |
| 9         | 3       | 4        | 5      | 5      | 5      |
| 9         | 20      | 1        | 5      | 5      | 5      |
| 9         | 20      | 2        | NULL   | NULL   | NULL   |
| 9         | 20      | 3        | 5      | 5      | 5      |
| 9         | 20      | 4        | 0      | 0      | 0      |

我需要比较CityID = 20中所有UserTypes的所有值以及CityID = 3中相应UserTypes的所有值.CountryID = 9.要比较的列是:Value1,Value2,Value3。

我只需要知道它们是否相互匹配。我尝试做了如下的事情:

SELECT CASE WHEN ISNULL(t1.Value1, 0) = ISNULL(t2.Value1, 0) THEN 1 ELSE 0 END AS Match1,
        CASE WHEN ISNULL(t1.Value2, 0) = ISNULL(t2.Value2, 0) THEN 1 ELSE 0 END AS Match2,
        CASE WHEN ISNULL(t1.Value3, 0) = ISNULL(t2.Value3, 0) THEN 1 ELSE 0 END AS Match3
FROM tblUserSettings t1
INNER JOIN tblUserSettings t2 ON t1.CountryID = t2.CountryID 
           AND t1.UserType = t2.UserType
           AND t1.CityID = 3
           AND t2.CityID = 20
WHERE t1.CountryID = 9

它给了我以下结果,我必须进一步处理以定义是否所有内容都匹配。

| Match1 | Match2  | Match3 |
| 1      | 1       | 1      |
| 1      | 1       | 1      |
| 1      | 1       | 1      |
| 0      | 0       | 0      |

我能否以输出中只有一列和一行的方式执行此操作 - 对于所有匹配只接收1或者如果至少一个不匹配则接收0?

2 个答案:

答案 0 :(得分:2)

如果您希望在所有值匹配时只有1的列,而0如果至少没有,请使用,

SELECT 
CASE WHEN ISNULL(t1.Value1, 0) = ISNULL(t2.Value1, 0) 
      AND ISNULL(t1.Value2, 0) = ISNULL(t2.Value2, 0) 
      AND ISNULL(t1.Value3, 0) = ISNULL(t2.Value3, 0) 
THEN 1 ELSE 0 END AS Match
FROM tblUserSettings t1
INNER JOIN tblUserSettings t2 ON t1.CountryID = t2.CountryID 
           AND t1.UserType = t2.UserType
           AND t1.CityID = 3
           AND t2.CityID = 20
WHERE t1.CountryID = 9

答案 1 :(得分:0)

如果您希望比较所有城市而不仅仅是两个城市,您应该能够通过分组而非加入来实现这一目标。

类似的东西:

SELECT 
CASE WHEN
       max(Value1)-min(Value1) = 0
       AND max(Value2)-min(Value2) = 0
       AND max(Value3)-min(Value3) = 0
THEN 1 ELSE 0 AS Match
FROM tblUserSettings
GROUP BY CountryID,UserType