我正在使用SQL Server 2005。
请考虑以下问题:
DECLARE @SearchTerm NVARCHAR(4)
SELECT @SearchTerm = 'X'
SELECT ProductCode -- NVARCHAR type
FROM Product
WHERE ProductCode LIKE '%' + @SearchTerm + '%'
如何根据以下特定条件为查询指定正确的分组/ order by子句?
例如,结果可能如下所示:
ProductCode
-----------
XAA
XMA
XZA
AXA
AXZ
BAX
BMX
BXZ
etc.
任何答案都会受到赞赏。
答案 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