Search code examples
sql-serversearch-engine

Search query, 'order by' priority


I need implement simple search in small content table: id, name, description, content. Results must be order by priorities

  1. name
  2. description
  3. content

it's mean that if searched word was found in description field, it will be shown only after all rows that have dog in name field

What I did:

I tried create temp table with structure like table that I use but with another field priority. for each field, these I use for search, do insert select to temp table

Example:

  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

Solution

  • One way of doing it would be using the CASE keyword:

    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