Условное предложение WHERE T-SQL

Математика. Max и Min для проверки границ: Я 've замеченный это в большом количестве кода:

if (x < lowerBoundary) 
{
   x = lowerBoundary;
}

я нахожу это меньшим, более чистым и более читаемым:

x = Math.Max(x, lowerBoundary);

Или можно также использовать тернарный оператор:

x = ( x < lowerBoundary) ? lowerBoundary : x;
28
задан OMG Ponies 20 December 2010 в 01:01
поделиться

1 ответ

Я изменил запрос, чтобы использовать EXISTS, потому что, если с POST связано более одного местоположения, будут дубликаты записей POST, для которых потребуется предложение DISTINCT или GROUP BY, чтобы избавиться от ...

Не-sargable

Это будет выполнять худшее из возможных решений:

SELECT p.*
  FROM POSTS p
 WHERE EXISTS(SELECT NULL
                FROM LOCATIONS l
               WHERE l.LocationId = p.LocationId
                 AND l.Condition1 = @Value1
                 AND l.SomeOtherCondition = @SomeOtherValue)
   AND (@IncludeBelow = 1 OR p.LocationTypeId = @LocationType)

Sargable, нединамическая версия

Самоочевидные ... .

BEGIN
  IF @IncludeBelow = 0 THEN
    SELECT p.*
      FROM POSTS p
     WHERE EXISTS(SELECT NULL
                    FROM LOCATIONS l
                   WHERE l.LocationId = p.LocationId
                     AND l.Condition1 = @Value1
                     AND l.SomeOtherCondition = @SomeOtherValue)
       AND p.LocationTypeId = @LocationType
  ELSE
    SELECT p.*
      FROM POSTS p
     WHERE EXISTS(SELECT NULL
                    FROM LOCATIONS l
                   WHERE l.LocationId = p.LocationId
                     AND l.Condition1 = @Value1
                     AND l.SomeOtherCondition = @SomeOtherValue) 
END

Унылая, динамическая версия (SQL Server 2005 +):

Любите или ненавидите это, динамический SQL позволяет написать запрос один раз. Просто имейте в виду, что sp_executesql кэширует план запроса, в отличие от EXEC в SQL Server. Настоятельно рекомендуем прочитать Проклятие и благословения динамического SQL , прежде чем рассматривать динамический SQL на SQL Server ...

DECLARE @SQL VARCHAR(MAX)
    SET @SQL = 'SELECT p.*
                  FROM POSTS p
                 WHERE EXISTS(SELECT NULL
                                FROM LOCATIONS l
                               WHERE l.LocationId = p.LocationId
                                 AND l.Condition1 = @Value1
                                 AND l.SomeOtherCondition = @SomeOtherValue)'

    SET @SQL = @SQL + CASE 
                        WHEN @IncludeBelow = 0 THEN
                         ' AND p.LocationTypeId = @LocationType '
                        ELSE ''
                      END   

BEGIN 

  EXEC sp_executesql @SQL, 
                     N'@Value1 INT, @SomeOtherValue VARCHAR(40), @LocationType INT',
                     @Value1, @SomeOtherValue, @LocationType

END
39
ответ дан 28 November 2019 в 03:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: