Sql server 搜索查询&x27;订购人';优先

Sql server 搜索查询&x27;订购人';优先,sql-server,search-engine,Sql Server,Search Engine,我需要在小的内容表中实现简单的搜索:id、名称、描述、内容。 结果必须按优先次序排列 名字 描述 内容 这意味着,若在描述字段中找到了搜索的单词,那个么它将仅显示在名称字段中包含dog的所有行之后 我所做的: DECLARE @query NVARCHAR(255) CREATE TABLE #tbl_search ( [id] INT NOT NULL , [name] NVARCHAR(255) , [description] NVAR

我需要在小的内容表中实现简单的搜索:id、名称、描述、内容。 结果必须按优先次序排列

  • 名字
  • 描述
  • 内容
  • 这意味着,若在描述字段中找到了搜索的单词,那个么它将仅显示在名称字段中包含dog的所有行之后

    我所做的:

      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
    
    我尝试使用类似于我使用的表的结构创建临时表,但具有另一个字段优先级。对于我用于搜索的每个字段,请将选择插入临时表

    示例:

      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
    

    最简单的方法是使用联合查询:

    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 + '%'
    

    一种方法是使用关键字:


    为了完整起见,我使用case-when-in-order子句(查询mysql)将@Amirshk brilliant solution移动到下一个级别:


    那么,有什么问题吗?我猜他在问,你会怎么做……是的,你说得对,这是一个问题:)很有趣,我不知道我有选择搜索的余地select@msony,现在你做:)
    CASE
    是一个非常强大的tool@msony我相信你不会得到复制品,除非你使用UNION ALL。他会得到复制品,原因查询仅包含1个冒号@Alex,您需要将所有3列添加到每个查询中(并保持条件不变)。
    SELECT name, description, content
    FROM tbl_content
    WHERE
        name LIKE '%' + @query + '%' OR
        desription LIKE '%' + @query + '%'  OR
        content LIKE '%' + @query + '%'
    ORDER BY CASE
            WHEN name LIKE '%' + @query + '%' THEN 1
            WHEN desription LIKE '%' + @query + '%'  THEN 2
            WHEN content LIKE '%' + @query + '%'  THEN 3
        END