Как сделать запрос с дополнительными параметрами поиска? - PullRequest
1 голос
/ 16 февраля 2011

У меня есть эти столбцы в моей таблице;

Categ - int
WorkPlace - int
WorkPlace1 - int
AsignedAs - int

, и я использую C #

  1. Я хочу выбрать все строки с помощью OR, если только однапараметры поиска не равны 0 Я добавил значение по умолчанию, чтобы узнать, выбирает ли пользователь в выпадающем списке или нет.

  2. Я хочу выбрать с помощью AND с этой последовательностью: если большечем параметры поиска не равны 0 (выбранное пользователем значение), что-то вроде этого

    WHERE Categ = @categ AND WorkPlace =
    @WorkPlace (user select two values
    

    , а остальные пустые или равны 0

  3. или

    WHERE WorkPlace = @WorkPlace AND
    WorkPlace1 = @WorkPlace1
    
  4. или

    WHERE Categ = @Categ AND WorkPlace = @WorkPlace1 
    

(пользователь выбирает эти значения и не является пустым, поэтому мы добавляем and к запросу)

и т. Д.

Поэтому я хочу проверить значения, если они пусты или нет, чтобы построить правильный запрос.

Ответы [ 2 ]

1 голос
/ 16 февраля 2011

См. Ссылку, указанную Гораном для обработки необязательных значений - в вашем случае вам нужно передать NULL хранимому процессу, если опция не выбрана пользователем. Если вы хотите продолжать использовать ноль (или другое значение), чтобы указать неприменимость параметра, чем вы можете изменить запрос, например

WHERE 
   (COALESCE(@Categ, 0) = 0 OR Categ = @Categ) AND 
   (COALESCE(@WorkPlace, 0) = 0 OR WorkPlace = @WorkPlace) AND 
   (COALESCE(@WorkPlace1, 0) = 0 OR WorkPlace1 = @WorkPlace1) AND 
   (COALESCE(@AsignedAs, 0) = 0 OR AsignedAs= @AsignedAs) 

Надеюсь, вы поняли основную идею!

0 голосов
/ 16 февраля 2011

Вы также можете использовать подход CASE.Я считаю это очень полезным и простым, и оптимизатор запросов SQL, похоже, выбирает лучшие планы выполнения для этого типа, где lcause:

WHERE CASE WHEN @Categ = 0 THEN 0 ELSE Categ END = CASE WHEN @Categ = 0 THEN 0 ELSE @Categ END
AND CASE WHEN @WorkPlace = 0 THEN 0 ELSE WorkPlace END = CASE WHEN @WorkPlace = 0 THEN 0 ELSE @WorkPlace END
AND CASE WHEN @WorkPlace1 = 0 THEN 0 ELSE WorkPlace1 END = CASE WHEN @WorkPlace1 = 0 THEN 0 ELSE @WorkPlace1 END
AND CASE WHEN @AsignedAs = 0 THEN 0 ELSE AsignedAs END = CASE WHEN @AsignedAs = 0 THEN 0 ELSE @AsignedAs END
...