2012-11-21 32 views
0

我正試圖找到應用以下邏輯的最佳方法。我們的業務邏輯要求我在var表中插入一堆行,然後選擇所有不同的記錄,但只有匹配具有相同id的所有記錄纔將條件設置爲正值[所以基本按位與]在SELECT上應用按位AND邏輯的最佳做法

希望我的示例解釋那更好。

DECLARE @sometable TABLE (
record_id INT NOT NULL, 
some_condition BIT NOT NULL) 

記錄在該表將匹配

record_id some_condition 
1   1 
1   0 
2   0 
3   0 

在上述情況下所需的輸出應該是

record_id some_condition 
1   0 
2   0 
3   0 

直到現在我怎麼一直在做這個是這樣的

SELECT DISTINCT record_id CAST(MIN(CAST(some_condition INT)) AS some_condition 
FROM @sometable 
GROUP BY record_id 

是重新做一個更好的方法?我不得不CAS,因爲MIN只需要數字類型。

回答

1

首先,你可以離開了DISTINCT,因爲GROUP BY已經使他們不同。另外,還可以避開最裏面CAST如果你只需要添加0:

SELECT record_id, CAST(MIN(some_condition+0) as BIT) AS some_condition 
FROM @sometable 
GROUP BY record_id 

最後,你真的需要在完成時重鑄一點?根據查詢結果的使用方式,可能不需要。

+0

是的,不幸的是,我們的DAL Layer代碼需要一個BIT,但我喜歡這個技巧+0 – BarendB

+0

@BarendB您的數據訪問層? ;) – ean5533

+0

大聲笑錯字...是的,它是一層層:P – BarendB

1

如何使用case語句?

select record_id, 
min(case when some_condition=0 then 0 else 1 end) as minCond 
from sometable 
group by 
record_id 
+0

咦?在sql-server-2008上,不是「真」= 1?如果是這樣的話,你的情況就變成了「當cond = false然後false else true」*(「min」只有在「真」時纔有意義-1)* –

+0

黑光,他確定了他的值爲some_condition in他的帖子,這是我使用的數據。 – Beth