Поисковый запрос, приоритет по порядку - PullRequest
3 голосов
/ 14 февраля 2010

Мне нужно реализовать простой поиск в маленькой таблице содержимого: идентификатор, имя, описание, содержимое. Результаты должны быть отсортированы по приоритетам

  1. имя
  2. описание
  3. содержание

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

Что я сделал:

Я попытался создать временную таблицу со структурой, подобной используемой мной таблице, но с другим приоритетом поля. для каждого поля, которое я использую для поиска, сделайте вставьте select в таблицу temp

* * Пример тысячи двадцать-одина: * ** 1023 тысячу двадцать две *

  DECLARE @query NVARCHAR(255)


  CREATE TABLE #tbl_search
    (
      [id] INT NOT NULL ,
      [name] NVARCHAR(255) ,
      [description] NVARCHAR(MAX) ,
      [content] NVARCHAR(MAX) ,
      [priority] INT
    )    


    --searching in name field
  INSERT    INTO #tbl_search
            ( [ID] ,
              [name] ,
              [description] ,
              [content] ,
              [priority]

            )
            SELECT  [ID] ,
                    [name] ,
                    [description] ,
                    [content] ,
                    1
            FROM    [tbl_content]
            WHERE   name LIKE '%' + @query + '%'

    --searching in description field            
  INSERT    INTO #tbl_search
            ( [ID] ,
              [name] ,
              [description] ,
              [content] ,
              [priority]

            )
            SELECT  [ID] ,
                    [name] ,
                    [description] ,
                    [content] ,
                    2
            FROM    [tbl_content]
            WHERE   description LIKE '%' + @query + '%'
                    AND id NOT IN ( SELECT  id
                                    FROM    #tbl_search )
   --.....           

  SELECT    *
  FROM      #tbl_search
  ORDER BY  [priority]

  DROP TABLE #tbl_search

Ответы [ 2 ]

4 голосов
/ 14 февраля 2010

Один из способов сделать это - использовать ключевое слово CASE :

SELECT name, description, content,
    priority = CASE
        WHEN name LIKE '%' + @query + '%' THEN 1
        WHEN desription LIKE '%' + @query + '%'  THEN 2
        WHEN content LIKE '%' + @query + '%'  THEN 3
    END CASE
FROM tbl_content
WHERE
    name LIKE '%' + @query + '%' OR
    desription LIKE '%' + @query + '%'  OR
    content LIKE '%' + @query + '%'
ORDER BY priority ASC
1 голос
/ 14 февраля 2010

Самый простой способ - использовать запрос UNION:

SELECT name AS text FROM tbl_content WHERE name LIKE '%' + @query + '%'
UNION
SELECT description AS text FROM tbl_content WHERE desription LIKE '%' + @query + '%'
UNION
SELECT content AS text FROM tbl_content WHERE content LIKE '%' + @query + '%'
...