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

时间:2011-10-19 09:40:44

标签: sql-server-2005 tsql

我正在使用SQL Server 2005。

请考虑以下问题:

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

SELECT ProductCode -- NVARCHAR type
FROM Product
WHERE ProductCode LIKE '%' + @SearchTerm + '%'

如何根据以下特定条件为查询指定正确的分组/ order by子句?

  1. 首先,ProductCode按照@SearchTerm
  2. 升序ProductCode STARTS
  3. 然后按ProductCode升序排序剩余的结果。
  4. 例如,结果可能如下所示:

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

    任何答案都会受到赞赏。

3 个答案:

答案 0 :(得分:2)

以下应该做你想要的。首先,我们按照ProductCode ASC的顺序从搜索词开始(注意:你的where子句的计算结果是,如果ProductCode包含@SearchTerm中的任何地方,而不仅仅是以它开头)。然后我们按ProductCode订购。 如果搜索ProductCode不是以@SearchTerm开头,那么我们只是按ProductCode排序(因为所有第一个值都是null)。

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

SELECT ProductCode 
FROM Product
WHERE ProductCode LIKE '%' + @SearchTerm + '%'
ORDER BY 
CASE WHEN ProductCode LIKE @SearchTerm + '%' THEN 0 ELSE 1 END
,CASE WHEN ProductCode LIKE @SearchTerm + '%' THEN ProductCode ELSE NULL END ASC
, ProductCode ASC 

答案 1 :(得分:0)

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

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

之后我们可以用外部查询

包装此查询和分组

答案 2 :(得分:0)

感谢大家的答案,但我自己提出了我的首选解决方案,注意其他答案使用LIKE @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