Sql server 2005 SQL Server 2005查询特定结果分组和排序依据

Sql server 2005 SQL Server 2005查询特定结果分组和排序依据,sql-server-2005,tsql,Sql Server 2005,Tsql,我正在使用SQLServer2005 请考虑以下查询: DECLARE @SearchTerm NVARCHAR(4) SELECT @SearchTerm = 'X' SELECT ProductCode -- NVARCHAR type FROM Product WHERE ProductCode LIKE '%' + @SearchTerm + '%' 如何在查询中指定正确的分组/排序依据子句,以便按照以下特定条件对结果排序? 首先,按ProductCode升序,ProductCode

我正在使用SQLServer2005

请考虑以下查询:

DECLARE @SearchTerm NVARCHAR(4)
SELECT @SearchTerm = 'X'

SELECT ProductCode -- NVARCHAR type
FROM Product
WHERE ProductCode LIKE '%' + @SearchTerm + '%'
如何在查询中指定正确的分组/排序依据子句,以便按照以下特定条件对结果排序?

  • 首先,按ProductCode升序,ProductCode以@SearchTerm开头
  • 然后按ProductCode升序排列剩余结果
  • 例如,结果可能如下所示:

    ProductCode
    -----------
    XAA
    XMA
    XZA
    AXA
    AXZ
    BAX
    BMX
    BXZ
    etc.
    

    如有任何答案,我们将不胜感激。

    以下内容将满足您的要求。首先,如果产品代码以搜索词开头,我们将按产品代码ASC进行订购(注意:where子句的计算结果是,产品代码中是否包含@SearchTerm,而不仅仅是以开头)。然后我们按产品代码订购。 如果搜索产品代码不是以@SearchTerm开头,那么我们只需按产品代码排序(因为所有的第一个order by值都将为空)


    作为一种选择,UNION解决方案可在此处应用:

    SELECT ProductCode
    FROM Product
    WHERE ProductCode LIKE @SearchTerm + '%'
    union
    SELECT ProductCode
    FROM Product
    WHERE ProductCode LIKE '%' + @SearchTerm + '%'
    and ProductCode NOT LIKE @SearchTerm + '%'
    

    之后,我们可以将此查询打包并使用外部查询分组

    谢谢大家的回答,但是我自己根据注意到其他答案使用的语法(如@SearchTerm+“%”),提出了我的首选解决方案,也就是说,删除第一个
    “%”
    给了我一个线索,让我想起了一个旧的Excel技巧:

    SELECT ProductCode
    FROM Product
    WHERE ProductCode LIKE '%' + @SearchTerm + '%'
    ORDER BY CASE WHEN LEFT(ProductCode, LEN(@SearchTerm)) = @SearchTerm THEN 0 ELSE 1 END ASC, ProductCode ASC
    

    抱歉,这根本不起作用(即使我注释掉
    ,Citicode ASC
    已修复,第一个order by条件消除了空值问题,即停止order byUnion只允许对整个语句执行一个order by条件(即第一个和第二个select)因此,您仍然必须执行cased order by。依赖sql server读取数据的默认顺序是不明智的。如果您依赖订单或需要订单,那么您应该将其放入sql中。您是对的,我已经忘记了这一细微差别。升级您的解决方案。
    SELECT ProductCode
    FROM Product
    WHERE ProductCode LIKE '%' + @SearchTerm + '%'
    ORDER BY CASE WHEN LEFT(ProductCode, LEN(@SearchTerm)) = @SearchTerm THEN 0 ELSE 1 END ASC, ProductCode ASC