Напишите sql для поиска с несколькими условиями - PullRequest
1 голос
/ 05 мая 2010

У меня есть таблица Студент с 2 полями:

Name: nvarchar(256)
Age: int

Пользователь будет использовать приложение WinForm для ввода имени и возраста для поиска.

  • Если введенное имя пусто, sql не будет запрашивать поле имени.
  • Если введенный возраст равен 0, sql не будет запрашивать поле возраста.
  • Если имя равно NULL и введенное имя пусто -> запись соответствует. Если имя равно NULL и введенное имя не пусто -> запись не соответствует. А также похоже на поле Возраст.

Моя проблема в том, как написать SQL как этот.

P / S: я использую SQL Server 2005.

Пожалуйста, помогите мне. Благодаря.

Ответы [ 3 ]

3 голосов
/ 05 мая 2010

Один из подходов состоит в том, чтобы сделать параметры обнуляемыми и использовать этот шаблон:

Create Procedure MyTest
(
    @param1 int = NULL,
    @param2 varchar = NULL 
)
AS
BEGIN

SELECT Blah...
FROM Table
WHERE
    ((@param1 IS NULL) OR (somecolumn = @param1)) AND
    ((@param2 IS NULL) OR (someothercolumn = @param2))


END

[Примечание: он может иметь побочные эффекты сниффинга параметров, если есть много параметров ...]

1 голос
/ 05 мая 2010
select * from thetable
where (@name='' or [name]=@name) and (@age=0 or age=@age)

Однако приведенный выше запрос вызывает сканирование таблицы. Для лучшей производительности и более сложного сценария (я полагаю, вы упростили вопрос в исходном посте), рассмотрите возможность использования динамического SQL. Кстати, Linq to SQL может очень просто помочь вам в создании динамического SQL, например:

IQueryable<Person> persons = db.Persons;
if (!string.IsNullOrEmpty(name)) persons = persons.Where(p=>p.Name==name);
if (age != 0) persons = persons.Where(p=>p.Age=age);
0 голосов
/ 05 мая 2010

Я бы использовал динамический SQL, создав предложение WHERE с переменным количеством терминов на основе входных данных.

Я недавно отвечал на вопросы для очень похожих случаев. Смотрите эти ответы для примеров:

Эти вопросы касались PHP, но эту технику можно адаптировать к любому языку программирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...