Renvoie les résultats de la requête SQL dans l'ordre d'input dans la clause WHERE

Utilisation: SSMS 2008, t-SQL

Objectif: Renvoyer les résultats de la requête dans le même ordre que je les ai entré dans la clause WHERE

Exemple:

select * from LoanTable where LoanNumber in (3,2,4,5,1) 

Oui, la requête simplifiée s'exécute ici, mais les résultats sont renvoyés dans l'ordre 1,2,3,4,5. Quand à la place je voudrais qu'ils soient returnnés dans l'ordre 3,2,4,5,1 (l'ordre d'input dans la clause WHERE).

Informations supplémentaires: La raison en est que j'utilise une boucle VBA dans Excel pour générer des couvertures pour chaque numéro de prêt tapé dans une colonne dans un classur Excel, et les feuilles de couverture doivent être générées / imprimées dans l'ordre dans lequel l'opérateur entre leur. Cela permet à l'opérateur de les marier facilement avec un autre document correspondant. Mais si les nombres de prêts reviennent de la requête SQL dans un ordre différent, ce process de mariage devient assez difficile quand l'opérateur traite des centaines de feuilles de calcul générées.

Puisque la clause order by est la seule façon de garantir l'ordre des sets de résultats, vous devez build une clause order by pour correspondre à votre clause where , comme ceci:

 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 

Si vous construisez l' where dynamicment, ce ne serait pas si mal, car la logique de l' order by match à chaque étape.

La construction (3,2,4,5,1) est un set. Il ne contient aucune command et on ne peut pas requestr une command basée sur celle-ci. Ce dont vous avez besoin est de passer un paramètre de table avec deux champs, un pour LoanNumber et un pour l'ordre désiré (rank). La requête en rejoignant le TVP:

 SELECT ... FROM LoanTable JOIN @tvp t ON LoanTable.LoanNumber = t.LoanNumber ORDER BY t.Order; 

En savoir plus sur les parameters de la table .

 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 

J'irais en créant un type de Table pour maintenir le LoanNumber à sélectionner. Ce faisant, la requête semblerait plus lisible.

 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; 

Si vous savez que votre expression de command est numérique, vous pouvez faire quelque chose comme ça:

 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 

Par cela, vous construisez une différence par input, obtenez 1 ou 0 si elle répond à vos critères de command, et commandz par cela.

Ce genre de chose est peut-être seulement à utiliser avec un petit jeu de résultats …