Условие в ГДЕ - PullRequest
       37

Условие в ГДЕ

1 голос
/ 16 февраля 2012

Я пытаюсь изменить мое предложение 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)

Есть ли другой способ сделать это?

Ответы [ 2 ]

3 голосов
/ 16 февраля 2012
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))
)
2 голосов
/ 16 февраля 2012

Вы можете переставить 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)
...