2015-05-05 2 views
0

Я просто возвращаю значения на основе введенных параметров, если описание элемента равно null, я не хочу включать это в предложение where.Включить в предложение where, если значение не равно

Как и описание товара, все остальные случаи были такими же.

ALTER Procedure [dbo].[WP_GetItems] 
    @IsActive  bit, 
    @OrderMode bit, 
    @OrderBy  varchar(75), 
    @Description varchar(250), 
    @DateFrom  datetime, 
    @DateTo  datetime, 
    @PriceFrom float, 
    @PriceTo  float 
as 
Begin 
    Select ItemID, ItemPartNumber, ItemDescription, CreatedDate, InitialPrice from Items where IsActive = @IsActive 
    CASE 
     WHEN @Description IS NOT NULL THEN AND ItemDescription LIKE '%' + @Description + '%' 
     WHEN @PriceFrom IS NOT NULL THEN AND InitialPrice >= @Price 
     WHEN @PriceTo IS NOT NULL THEN AND InitialPrice <= @Price 
    END 
    order by 
    CASE WHEN @OrderBy='ItemDescription' AND @OrderMode = 0 THEN ItemDescription END ASC, 
    CASE WHEN @OrderBy='ItemDescription' AND @OrderMode = 1 THEN ItemDescription END DESC, 
    CASE WHEN @OrderBy='ItemPartNumber' AND @OrderMode = 0 THEN ItemPartNumber END ASC, 
    CASE WHEN @OrderBy='ItemPartNumber' AND @OrderMode = 1 THEN ItemPartNumber END DESC, 
    CASE WHEN @OrderBy='CreatedDate' AND @OrderMode = 0 THEN CreatedDate END ASC, 
    CASE WHEN @OrderBy='CreatedDate' AND @OrderMode = 1 THEN CreatedDate END DESC, 
    CASE WHEN @OrderBy='InitialPrice' AND @OrderMode = 0 THEN InitialPrice END ASC, 
    CASE WHEN @OrderBy='InitialPrice' AND @OrderMode = 1 THEN InitialPrice END DESC 
End 

За выполнение этого запроса у меня есть ошибка. Incorrect syntax near the keyword 'CASE'.

+0

Это потому, что вы не можете использовать инструкцию CASE. Вам необходимо использовать Dynamic SQL и выработать свою логику, прежде чем объединить предложение where. –

+1

На самом деле, вам совсем не нужен оператор case. Просто сделайте 'where (@Description null или ItemDescription = @Description) и (@PriceFrom имеет значение null или Price> = @PriceFrom)' и т. Д. Кроме того, в качестве примечания обратите внимание, что 'case' может иметь только один возврат value - так что даже если это действительно работает (оно не может), оно не позволит вам выполнять поиск по нескольким полям за раз. – Luaan

ответ

0

Вы не можете использовать часть И внутри вашего CASE. Попробуйте это:

WHERE IsActive = @IsActive 
AND ItemDescription LIKE CASE WHEN @Description IS NOT NULL THEN '%' + @Description + '%' END 
AND InitialPrice >= CASE WHEN @PriceFrom IS NOT NULL THEN @Price ELSE InitialPrice END 
AND InitialPrice <= CASE WHEN @PriceTo IS NOT NULL THEN @Price ELSE InitialPrice END 

Еще один вариант, как это было предложено Louaan в комментариях, чтобы сделать это:

AND (@Description IS NULL OR ItemDescription LIKE '%'+ @Description +'%') 
AND (@PriceFrom IS NULL OR InitialPrice >= @PriceFrom) 
AND (@PriceTo IS NULL OR InitialPrice <= @PriceTo) 

Этот вариант лучше, так как нет необходимости для сервера SQL для проверки фактические данные, если переменная равна нулю.

Примечание № 1 Если один из столбцов является нулевым, вам нужно будет решить, как обрабатывать нулевые значения, так как NULL = NULL всегда возвращает false.

Примечание № 2 Возможно, вы захотите включить подсказку перекомпиляции с этой хранимой процедурой для повышения производительности. read this article to find out why.

+0

Это изменит логический поток запроса, не так ли? Он хочет искать на всех трех? –

+0

Если описание не является нулевым, выполните поиск описания, если цена не равна нулю, включите цену в предложение where. Это мое желание. –

+0

Я отредактировал свой ответ, чтобы включить предложение Луаана. Оба стиля получат тот же результат. но я верю, что второй лучше. –

Смежные вопросы