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