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 …