2012-02-16 112 views
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 = 0includeNullType = 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

我不能相信我没有尝试这样做。非常感谢! – 2012-02-16 17:31:36

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)