Уменьшить код в предложение where без использования динамического SQL


Как я могу написать следующий запрос T-SQL-запроса в более короткий путь, без использования динамического SQL?

WHERE
    ( (@Max IS NULL OR @Type <> 'Products')
        OR (@Max IS NOT NULL AND @Type = 'Products'
            AND ProductCount >  @Max ) )

    AND ( (@Min IS NULL OR @Type <> 'Products')
        OR (@Min IS NOT NULL AND @Type = 'Products'
            AND ProductCount <  @Min ) )

    AND ( (@Max IS NULL OR @Type <> 'Vendors')
        OR (@Max IS NOT NULL AND @Type = 'Vendors'
            AND VendorCount >  @Max ) )

    AND ( (@Min IS NULL OR @Type <> 'Vendors' )
        OR (@Min IS NOT NULL AND @Type = 'Vendors'
            AND VendorCount <  @Min ) )

    AND ( (@Max IS NULL OR @Type <> 'Order')
        OR (@Max IS NOT NULL AND @Type = 'Order'
            AND OrderCount >  @Max ) )

    AND ( (@Min IS NULL OR @Type <> 'Order')
        OR (@Min IS NOT NULL AND @Type = 'Order'
            AND OrderCount <  @Min ) )


Комментарии
3 ответа

Вам придется тщательно проверить, но следующий запрос должен работать:

WHERE 
(
@Max IS NULL
OR @Type = 'Products' AND ProductCount > @Max
OR @Type = 'Vendors' AND VendorCount > @Max
OR @Type = 'Order' AND OrderCount > @Max
)
AND
(
@Min IS NULL
OR @Type = 'Products' AND ProductCount < @Min
OR @Type = 'Vendors' AND VendorCount < @Min
OR @Type = 'Order' AND OrderCount < @Min
)

6
ответ дан 1 июня 2011 в 06:06 Источник Поделиться

Что-то вроде этого

Вы можете рассчитывать на сравнения со значением null всегда дает ложь (строго: неизвестный) если @Max или @Мин-нуль для соответствующего случая

WHERE
CASE @Type
WHEN 'Products' THEN ProductCount
WHEN 'Vendors' THEN VendorCount
WHEN 'Order' THEN OrderCount
END > @Max
OR
CASE @Type
WHEN 'Products' THEN ProductCount
WHEN 'Vendors' THEN VendorCount
WHEN 'Order' THEN OrderCount
END < @Min

6
ответ дан 1 июня 2011 в 07:06 Источник Поделиться

Вот еще кое-что, на основе ГБН по делу идею, но, используя период , чтобы избежать повторения случаев:

WHERE
CASE @Type
WHEN 'Products' THEN ProductCount
WHEN 'Vendors' THEN VendorCount
WHEN 'Orders' THEN OrderCount
END BETWEEN IFNULL(@Min,0) AND IFNULL(@Max,99999999)

Примечание: IFNULL в MySQL должны быть заменены на функции isnull в TSQL не

3
ответ дан 11 июня 2011 в 04:06 Источник Поделиться