Поиск SQL с использованием регистра или - PullRequest
1 голос
/ 10 марта 2011

Все до сих пор были супер помощью.Мой следующий вопрос: как мне лучше подойти к этому ... Если у меня есть 7 полей, которые пользователь может искать, как лучше всего проводить этот поиск, у них может быть любая комбинация из 7 полей, так что это 7!или 5040 комбинаций, которые невозможно закодировать так много.Так как мне учитывать, когда пользователь выбирает поле 1 и поле 3 или они выбирают поле 1, поле 2 и поле 7?Легко ли это сделать с помощью SQL?Я не знаю, должен ли я подойти к этому с помощью оператора IF или перейти к CASE в операторе выбора.Или я должен идти в совершенно ином направлении?Хорошо, если у кого-нибудь есть какие-нибудь полезные указатели, я был бы очень признателен.

Спасибо

Ответы [ 5 ]

2 голосов
/ 10 марта 2011

Возможно, вы захотите изучить использование динамического SQL для этого.См. Условия динамического поиска в T-SQL и Catch-all запросы для хороших статей по этой теме.

0 голосов
/ 10 марта 2011

Зависит от:

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

вы можете попробовать что-то вроде:

CREATE PROC dbo.Search(
  @param1 INT = NULL,
  @param2 VARCHAR(3) = NULL
)
AS

BEGIN
  SET NOCOUNT ON

  -- create temporary table to keep keys (primary) of matching records from searched table     
  CREATE TABLE #results (k INT)

  INSERT INTO 
    #results(k)
  SELECT -- you can use TOP here to norrow results
    key
  FROM
    table
  -- you can use WHERE if there are some default conditions

  PRINT @@ROWCOUNT

  -- if @param1 is set filter #result    
  IF @param1 IS NOT NULL BEGIN
    PRINT '@param1'

    ;WITH d AS (
      SELECT
        key
      FROM
        table
      WHERE
        param1 <> @param1
    )
    DELETE FROM 
      #results
    WHERE
      k = key

    PRINT @@ROWCOUNT
  END

  -- if @param2 is set filter #result
  IF @param2 IS NOT NULL BEGIN
    PRINT '@param2'

    ;WITH d AS (
      SELECT
        key
      FROM
        table
      WHERE
        param2 <> @param2
    )
    DELETE FROM 
      #results
    WHERE
      k = key

    PRINT @@ROWCOUNT
  END

  -- returns what left in #results table
  SELECT
    table.* -- or better only columns you need
  FROM
    #results r
    JOIN
      table 
    ON
      table.key = r.k
END

Я использую эту технику в большой базе данных (миллионы записей, но запущена на большом сервере) для фильтрации данных из некоторых предопределенных данных. И это работает довольно хорошо.

Однако мне не нужны все соответствующие записи - в зависимости от запроса достаточно 10-3000 соответствующих записей.

0 голосов
/ 10 марта 2011

Если вы используете хранимую процедуру, вы можете использовать этот метод:

CREATE PROCEDURE dbo.foo 
    @param1 VARCHAR(32) = NULL, 
    @param2 INT = NULL 
AS 
BEGIN 
    SET NOCOUNT ON 

SELECT * FROM MyTable as t
WHERE (@param1 IS NULL OR t.Column1 = @param1)
AND   (@param2 IS NULL OR t.COlumn2 = @param2)

END 
GO 

Обычно их называют необязательными параметрами. Идея состоит в том, что если вы не передадите единицу, он получит значение по умолчанию (ноль), и этот раздел предложения where всегда возвращает true.

0 голосов
/ 10 марта 2011

Вы могли бы написать хранимую процедуру, которая принимает каждый параметр как ноль, а затем написать ваше предложение WHERE, например:

WHERE (field1 = @param1 or @param1 is null) 
AND (field2 = @param2 or @param2 is null) etc...

Но я бы не рекомендовал это.Это может определенно повлиять на производительность, делая это таким образом, в зависимости от количества параметров, которые у вас есть.Второй ответ Джо Стефанелли на рассмотрение динамического SQL в этом случае.

0 голосов
/ 10 марта 2011
Select f1,f2  from table where f1 like '%val%' or f2 like '%val%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...