2009-05-29 65 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