Оптимизация запроса SQL Server на основе характера ввода

#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);