#sql #sql-server #tsql
#sql #sql-сервер #tsql
Вопрос:
У меня есть два входных данных и два столбца col1 и col2 в tableTemp
DECLARE @startTemp INT;
DECLARE @endTemp INT;
Если значение @startTemp is 0
select *
from tableTemp
where a IS NULL and b = @endTemp;
Если значение @startTemp is > 0
select *
from tableTemp
where a = @startTemp-1 and b = @endTemp;
На основе @startTemp есть ли какой-либо способ, которым я могу написать вышеуказанный запрос в одном запросе
, как показано ниже?
select *
from tableTemp
where (if (a = 0) check a is NULL else check a = @startTemp-1)) and b = @endTemp;
Ответ №1:
Одним из возможных подходов с одним WHERE
предложением является следующее утверждение:
DECLARE @startTemp INT
DECLARE @endTemp INT
--SET @startTemp = ...
--SET @endTemp = ...
SELECT *
FROM tableTemp
WHERE
(
((@startTemp = 0) AND (a IS NULL)) OR
((@startTemp > 0) AND (a = @startTemp - 1))
) AND
(b = @endTemp)
Ответ №2:
Если вы хотите повысить производительность, используйте динамический запрос, подобный приведенному ниже:
DECLARE @startTemp INT;
DECLARE @endTemp INT;
DECLARE @sqlQuery nvarchar(1000) = 'SELECT * FROM tableTemp';
IF @startTemp = 0
SET @sqlQuery = CONCAT(@sqlQuery, ' WHERE a = @startTemp-1 and b = @endTemp');
-- Add other conditions here
PRINT (@sqlQuery); -- Just to see what is generated
EXEC (@sqlQuery);