Математика. Max и Min для проверки границ: Я 've замеченный это в большом количестве кода:
if (x < lowerBoundary)
{
x = lowerBoundary;
}
я нахожу это меньшим, более чистым и более читаемым:
x = Math.Max(x, lowerBoundary);
Или можно также использовать тернарный оператор:
x = ( x < lowerBoundary) ? lowerBoundary : x;
Я изменил запрос, чтобы использовать EXISTS, потому что, если с POST связано более одного местоположения, будут дубликаты записей POST, для которых потребуется предложение DISTINCT или GROUP BY, чтобы избавиться от ...
Это будет выполнять худшее из возможных решений:
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)
Самоочевидные ... .
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 позволяет написать запрос один раз. Просто имейте в виду, что 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