2012-02-16 19 views
1

テーブルの1列の値に基づいてWHERE句を変更しようとしています。 私のテーブルは以下のとおりです。WHERE節の条件

server_updates

k1ID  updID 
----------- ----------- 

server_updates_cat

sucID  updID  catID  selectChildren includeNullType 
----------- ----------- ----------- ---------------- -------------- 

server_updates_types

sucID  typeID 
----------- ----------- 

そして、ここでは、私がやっているものです:

DECLARE @k1_catID INT 
DECLARE @k4_type INT 

SET @k1_catID = 30 
SET @k4_type = 1 

SELECT suc.sucID, suc.updID FROM server_updates su 
INNER JOIN server_updates_cat suc ON suc.updID = su.updID 

WHERE 
includeNullType = 0 
    AND suc.catID = @k1_catID 
    AND selectChildren = 1 
    AND @k4_type IN (SELECT typeID FROM server_updates_types sut WHERE sut.sucID = suc.sucID) 
OR 
includeNullType = 1 
    AND KSUC.catID = @k1_catID 
    AND selectChildren = 1 
    AND (@k4_type IN (SELECT typeID FROM server_updates_types sut WHERE sut.sucID = suc.sucID) OR @k4_type IS NULL) 
私は私が実際に変更する必要がある唯一の事、すべての条件のいずれか includeNullType = 0または includeNullType = 1を繰り返す必要がありますが、変更されないしたいと思います

@k4_type IN (SELECT typeID FROM server_updates_types sut WHERE sut.sucID = suc.sucID)

これを行う別の方法はありますか?

答えて

3
WHERE suc.catID = @k1_catID 
AND selectChildren = 1 
AND (
(includeNullType = 0 
AND @k4_type IN (SELECT typeID FROM server_updates_types sut WHERE sut.sucID = suc.sucID)) 
OR 
(includeNullType = 1 
    AND (@k4_type IN (SELECT typeID FROM server_updates_types sut WHERE sut.sucID = suc.sucID) OR @k4_type IS NULL)) 
) 
+0

と論理的に等価です。どうもありがとうございます! –

2

ANDとORを並べ替えることができます。簡素化:

includeNull = 0 AND LONG_CONDITION 
OR 
includeNull = 1 AND (LONG_CONDITION OR COND2) 

includeNullのみ0または1であることができれば、これは私がこれを試していなかったと信じてすることはできません

LONG_CONDITION OR (includeNull = 1 AND COND2)