使用: SSMS 2008,t-SQL
目标:以与我将其输入WHERE子句相同的顺序返回查询结果
示例:
select *
from LoanTable
where LoanNumber in (3,2,4,5,1)
是的,此处运行简化查询,但结果以1,2,3,4,5的顺序返回。相反,我希望它们以3,2,4,5,1(输入WHERE子句的顺序)的顺序返回。
附加信息:这是因为我在Excel中使用VBA循环为每个在Excel工作簿中的列中键入的贷款号生成封面,并且需要生成封面页/按操作员输入的顺序打印。这允许操作员容易地将它们与另一个相应的文档结合。但是如果贷款号码以不同的顺序从SQL查询中返回,那么当操作员处理生成的数百个封面时,这种结婚过程变得非常困难。
答案 0 :(得分:2)
由于order by
子句是确保结果集顺序的唯一方法,因此您必须构建一个order by
子句以匹配您的where
子句,如下所示:
select *
from LoanTable
where LoanNumber in (3,2,4,5,1)
order by case LoanNumber
when 3 then 1
when 2 then 2
when 4 then 3
when 5 then 4
when 1 then 5
else 9999 end
如果你动态构建where
,这不会太糟糕,因为order by
的逻辑在每一步都会匹配。
答案 1 :(得分:1)
构造(3,2,4,5,1)
是一个集合。它不包含任何订单,也不能根据它请求ORDER BY。你需要的是传递一个带有两个字段的表值参数,一个用于LoanNumber
,一个用于所需的顺序(等级)。加入TVP的查询:
SELECT ...
FROM LoanTable
JOIN @tvp t ON LoanTable.LoanNumber = t.LoanNumber
ORDER BY t.Order;
答案 2 :(得分:0)
select *
from LoanTable
join (values (3,1), (2,2), (4,3), (5,4), (1,5)) v(Id, Or)
on LoanTable.LoanNumber = v.ID
order by v.Or
答案 3 :(得分:0)
我会创建一个Table
类型来保存要选择的LoanNumber。这样做,查询看起来更具可读性。
DECLARE @LoanNumberTable TABLE ( [ID] INT IDENTITY (1,1), [LoanNumber] INT ); INSERT INTO @LoanNumberTable VALUES (3), (2), (4), (5), (1); SELECT LoanTable.* FROM LoanTable INNER JOIN @LoanNumberTable AS Temp ON LoanTable.LoanNumber = Temp.LoanNumber ORDER BY Temp.ID;
答案 4 :(得分:-1)
如果您知道您的订单表达式是数字的,您可以这样做:
select *, abs(sign(LoanNumber-3)) as Ord1, abs(sign(LoanNumber-2)) as Ord2, abs(sign(LoanNumber-4)) as Ord3...
from LoanTable
where LoanNumber in (3,2,4,5,1)
ORDER BY Ord1, Ord2, Ord3
通过这种方式,您可以为每个输入构建差异,如果它符合您的ordercriteria,则获得1或0,并按此顺序。
这种事情可能只适用于小结果集......