2009-05-29 71 views
2

可以说,我有诸如列的表:如何从结果集中只选择公共属性?

  • ID
  • Name
  • City
  • State
  • ZIP

我需要编写一个查询,将只返回一行。这一行将包括City,State,ZIP,但我只想要一个字段有一个值,如果结果集中的所有值都是相同的,否则我希望该字段为null

例如,如果每条记录具有相同的状态,则State将返回结果。如果只是一个的结果具有不同的状态,我希望该字段为null。在SQL Server 2005中可以这样做吗?

基本上,我想这样的查询:

SELECT City, State, ZIP 
FROM Users 
WHERE ID IN(1,2,3,4,5,6) 

但只返回一行,与我上述的规格。

回答

6
SELECT 
    CASE WHEN COUNT(DISTINCT city) = 1 THEN MAX(city) ELSE NULL END AS city, 
    CASE WHEN COUNT(DISTINCT state) = 1 THEN MAX(state) ELSE NULL END AS state, 
    CASE WHEN COUNT(DISTINCT zip) = 1 THEN MAX(zip) ELSE NULL END AS zip 
FROM Users 
WHERE ID IN(1,2,3,4,5,6) 

其他的答案后:

SELECT 
    CASE WHEN COUNT(DISTINCT NULLIF(city,'**NULL**')) = 1 THEN MAX(city) ELSE NULL END AS city, 
    CASE WHEN COUNT(DISTINCT NULLIF(state,'**NULL**')) = 1 THEN MAX(state) ELSE NULL END AS state, 
    CASE WHEN COUNT(DISTINCT NULLIF(zip,'**NULL**')) = 1 THEN MAX(zip) ELSE NULL END AS zip 
FROM Users 
WHERE ID IN(1,2,3,4,5,6) 
+0

,使该解决方案完全安全的,你需要使用一个检查约束,以确保** ** NULL不能保存在任何涉及的专栏 – 2009-05-29 20:15:33

+0

好点。我只使用** NULL **来强调,但我仍然需要它用于空字符串。 – gbn 2009-06-01 14:14:18

2

如果列不可为空,或者如果你想忽略空则GBN的答案是正确的。但是,如果你需要将NULL值视为不同的值,试试这个:

CASE WHEN COUNT(DISTINCT city) = 1 
     AND COUNT(city) = COUNT(*) 
    THEN MAX(city) ELSE NULL END AS city