2016-01-10 2 views
0

См я могу передать 2 параметра в процедуре фильтрации моего поиска т.е. ComplainantName or ComplaintSubject or (ComplainantName AND ComplaintSubject)Как настроить несколько условий в одном запросе?

Так можно настроить в этом запросе, который просто работает с ComplainantName?

@ComplainantName varchar(100), 
@ComplaitSubject varchar(MAX) 

Select * from ComplaintsInfo 
where ComplainantName= @ComplainantName 

Я наивный человек и стараюсь его сортировать.

ПРИМЕЧАНИЕ: Оба или один из них может быть пустым иногда т.е. пользователь может выбрать, чтобы пройти только ComplaintSubject так что в этом случае ComplainantName будет ""

ответ

2

Вы могли бы использовать:

DECLARE @ComplainantName varchar(100), 
     @ComplaitSubject varchar(MAX); 

Select * 
from ComplaintsInfo 
where (ComplainantName = @ComplainantName OR @ComplainantName IS NULL) 
    AND (ComplaitSubject = @ComplaitSubject OR @ComplaitSubject IS NULL); 

-- @ComplainantName/Subject = '' if empty string indicates missing value 

Если вы хотите найти используя только один параметр, передайте второй как NULL. Таким образом, можно фильтровать с помощью:

╔══════════════════╦══════════════════╦═════════════════════════════════════════════════════════════════╗ 
║ @ComplainantName ║ @ComplaitSubject ║        result        ║ 
╠══════════════════╬══════════════════╬═════════════════════════════════════════════════════════════════╣ 
║ NULL    ║ NULL    ║ all                ║ 
║ NULL    ║ val    ║ records with ComplaitSubject='val'        ║ 
║ val    ║ NULL    ║ records with ComplainantName='val'        ║ 
║ val1    ║ val2    ║ records with ComplaitSubject='val1' and ComplainantName='val2' ║ 
╚══════════════════╩══════════════════╩═════════════════════════════════════════════════════════════════╝ 

EDIT:

Я также попытался это и кажется, работает сейчас, это нормально? Выберите * из ComplaintsInfo где ComplainantName как '%' + @ComplainantName + '%' и COmplaintSubejct как '%' + @ ComplaintSubject + '%'

Да, вы можете изменить ComplainantName = @ComplainantName с ComplainantName like '%'+ @ComplainantName +'%', но вы должны знать, что выражение, начинающееся с подстановочным знаком не является допустимым. Если это индекс в этом оптимизаторе запросов столбца, он пропустит его.

Select * 
from ComplaintsInfo 
where (ComplainantName like '%'[email protected]+'%' OR @ComplainantName IS NULL) 
    AND (ComplaitSubject like '%'[email protected]+'%' OR @ComplaitSubject IS NULL); 

Вы также могли бы рассмотреть возможность использования FULL-TEXT INDEX для струнного поиска.

+0

Хорошо, спасибо большое, я тоже попробую. Я также пробовал это и, похоже, сейчас работает, все в порядке? Выберите * from ComplaintsInfo , где Истец-имя как '%' + @ComplainantName + '%' AND COmplaintSubejct как '%' + @ ComplaintSubject + '%' –

+0

@StackyFlowy Вам нужно обрабатывать «NULL»/отсутствующие значения. Если пользователь передает 'ComplainantName = NULL', вы не получите никаких записей. – lad2025

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