Подтвердить что ты не робот

Объединение сервера Sql с условием If

У меня есть запрос вроде:

DECLARE @tmpValue
SET @tmpValue = 0 -- it will be change 

SELECT * FROM Animal WHERE AniActive = 1
UNION 
IF @tmpValue > 0 
SELECT * FROM Animal WHERE.Active = 0

Когда я использую это, он дает ошибку из-за условия. Я должен использовать UNION из-за нашей структуры.

Как я могу использовать его с условием if?

Спасибо,
Джон

4b9b3361

Ответ 1

Переместите условие @tmpValue > 0 в предложение WHERE следующим образом:

SELECT * FROM Animal WHERE AniActive = 1
UNION
SELECT * FROM Animal WHERE @tmpValue > 0 AND Active = 0

Ответ 2

Вы можете добавить свое условие к запросу вроде этого. часть раздела объединения просто не вернет никаких результатов, если ваше тестовое условие ложно:

DECLARE @tmpValue

SET @tmpValue = 0 -- it will be change 

SELECT * FROM Animal WHERE AniActive = 1
UNION 
SELECT * FROM Animal WHERE.Active = 0 and @tmpValue > 0

Ответ 3

Лучший способ поставить условие в Query - это оператор CASE. вы можете поставить любое количество условий в запросе. Оператор CASE используется для установки условных фильтров в Query.

Для EX.

DECLARE @tmpValue
SET @tmpValue = 0 -- it will be change 

SELECT * FROM Animal WHERE AniActive = 1
UNION
SELECT * FROM Animal 
WHERE 
1 = CASE WHEN @tmpValue  = 0 THEN 0 ELSE Active = 1 END

ваша ситуация не сложна, но для более сложного условия вы можете использовать вложенный запрос CASE в Query.

Ответ 4

Вот способ сделать это, что упрощает код, полностью избавившись от UNION. Я всегда предпочитаю более простое решение, где это возможно. Это также будет лучше работать, если выбор выполняет сканирование таблицы, поскольку он будет сканировать его один раз, а не (потенциально) дважды.

DECLARE @tmpValue

SET @tmpValue = 0 -- it will be change

SELECT * FROM Animal WHERE AniActive = 1 OR @tmpValue > 0