按输入顺序将SQL查询结果返回到WHERE子句

时间:2016-09-15 21:02:38

标签: sql sql-server tsql

使用: 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查询中返回,那么当操作员处理生成的数百个封面时,这种结婚过程变得非常困难。

5 个答案:

答案 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;

详细了解table valued parameters

答案 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,并按此顺序。

这种事情可能只适用于小结果集......