SQL, где предложение в вопросе выбора оператора - PullRequest
1 голос
/ 15 июля 2010

Я использую SQL Server 2008 Enterprise с Windows Server 2008 Enterprise.У меня есть таблица базы данных под названием «Книга», в которой много столбцов, и в этом вопросе важны три столбца:

  • Автор, varchar;
  • Страна, varchar;
  • Домен, varchar.

Я хочу написать процедуру хранения со следующей логикой, но я не знаю, как писать (из-за сложных условий запроса), буду признателен, если кто-нибудь сможет написатьобразец для меня?

Входной параметр: p_author как varchar, p_country как varchar и p_domain как varchar

Условия запроса:

  1. , если p_author указан из ввода, тогда любая строка, для которой столбец Author LIKE% p_author% удовлетворяется условием, если p_author не указан из входных данных, каждая строка удовлетворяется этим условием;
  2. , если p_country указана из входных данных, то любая строка, столбец Country которой указан= p_country удовлетворяется условием, если p_country не определено из входных данных, каждая строка удовлетворяется этим условием;
  3. , если p_domain заданоесли задано значение input, то любая строка, для которой столбец Domain LIKE% p_domain% удовлетворяется, если p_domain не указан из input, каждая строка удовлетворяется этим условием;

Результаты, которые я хочу вернуть (должны быть выполненысо всеми следующими условиями):

  • записей, удовлетворяющих как условию 1, так и 2;
  • записей должны соответствовать условию 3;
  • возвращать отдельные строки.

Например, можно вернуть записи, соответствующие условию 1 и условию 3, а записи, соответствующие условию 2 и условию 3, можно вернуть.

заранее спасибо, Джордж

Ответы [ 2 ]

2 голосов
/ 15 июля 2010

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

Прочтите это и рассмотрите все методы. Ваш лучший метод будет зависеть от ваших параметров, ваших данных, вашей схемы и вашего фактического использования:

Условия динамического поиска в T-SQL. Автор Erland Sommarskog

Проклятие и благословения динамического SQL Эрланда Соммарского

Если у вас есть правильная версия SQL Server 2008 (SQL 2008 SP1 CU5 (10.0.2746) и более поздние версии), вы можете использовать этот маленький трюк для фактического использования индекса:

Вы ничего не можете сделать, поскольку используете LIKE, но если бы вы использовали равенство, вы могли бы добавить OPTION (RECOMPILE) в свой запрос, см. Статью Erland, и SQL Server разрешит OR изнутри (Column = @Param+'%' OR @Param='') AND ... перед созданием плана запроса на основе значений времени выполнения локальных переменных, и индекс можно использовать, если вы не используете LIKE.

1 голос
/ 15 июля 2010

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

 SELECT * 
FROM Books
WHERE (
   ((Author LIKE '%' + @p_author + '%' OR @p_author = '') OR 
   (Country LIKE '%' + @p_country + '%' OR @p_country = ''))
   AND (@p_author <> '' OR @p_country <> '')
) AND 
(Domain LIKE '%' + @p_domain + '%' OR '%' @p_domain = '')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...