2010-02-14 1 views
3

Мне нужно реализовать простой поиск в таблице небольшого содержимого: id, name, description, content. Результаты должны быть порядок по приоритетамПоисковый запрос, 'order by' priority

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

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

Что я сделал:

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

Пример:

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 
+0

Каков фактический вопрос? –

+1

Итак, есть ли где-то вопрос? – Guffa

+0

Я думаю, он спрашивает, как бы это сделать .. – Amirshk

ответ

4

Одним из способов сделать это будет использование ключевого слова 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 
+0

Интересно, я не знал, что у меня есть опция для поиска в списке – Sasha

+0

@msony, теперь вы делаете :) 'CASE' - очень мощный инструмент – Amirshk

1

Проще всего было бы использовать 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 + '%' 
+0

здесь я получу дубликаты – Sasha

+0

@msony Я считаю, что вы не получите дубликатов, если не используете UNION ALL. –

+0

он получит дубликаты, потому что запрос содержит только 1 coloum. @Alex, вам нужно добавить все три столбца к каждому запросу (и оставить условие как есть). – Amirshk

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

  • Нет связанных вопросов^_^