J'écris une requête simple dans SQL Server:
Select
EmpId, EmpName, Sal
from
Emp
where
EmpId in (10,9,5,7,3,8);
7 Réponses :
aucun moyen de le faire de manière native. Essayez:
SELECT EmpId,EmpName,Sal
FROM Emp
WHERE EmpId IN (10,9,5,7,3,8)
ORDER BY CASE EmpId
WHEN 10 THEN 1
WHEN 9 THEN 2
WHEN 5 THEN 3
WHEN 7 THEN 4
WHEN 3 THEN 5
WHEN 8 THEN 6
ELSE 7
END;
Vous pouvez utiliser une variable de table pour transmettre les entrées. Vous devez insérer les enregistrements dans cette variable de table dans la commande souhaitée. Essayez ceci. P> P>
Vous pouvez le faire de manière dynamique si votre liste est une chaîne délimitée des virgules. Tout d'abord, vous devez avoir une fonction séparatrice. Voici le Delimitedsplit8k strong> écrit par Jeff Moden:
DECLARE @empIds VARCHAR(MAX) = '10,9,5,7,3,8';
SELECT e.EmpId, e.EmpName, e.Sal
FROM Emp e
INNER JOIN dbo.DelimitedSplit8K(@empIds, ',') s
ON s.Item = l.EmpId
ORDER BY s.ItemNumber
La requête suivante vous donnera le résultat exact (sans commande par):
Si IDS code> est une variable passée en tant que paramètre d'entrée sur une procédure stockée, vous pouvez la diviser en utilisant CTE . --@inputIDs VARCHAR(300) => '10,9,5,7,3,8'
;WITH MyIds AS
(
SELECT 1 AS Position, CONVERT(INT, LEFT(@inputIds, CHARINDEX(',', @inputIDs)-1)) AS MyId,
RIGHT(@inputIds, LEN(@inputIds) - CHARINDEX(',', @inputIDs)) AS Remainder
WHERE CHARINDEX(',', @inputIDs)>0
UNION ALL
SELECT Position +1 AS Position, CONVERT(INT, LEFT(Remainder, CHARINDEX(',', Remainder)-1)) AS MyId,
RIGHT(Remainder, LEN(Remainder) - CHARINDEX(',', Remainder)) AS Remainder
FROM MyIds
WHERE CHARINDEX(',', Remainder)>0
UNION ALL
SELECT Position +1 AS Position, CONVERT(INT, Remainder) AS MyId,
NULL AS Remainder
FROM MyIds
WHERE CHARINDEX(',', Remainder)=0
)
SELECT e.EmpId, e.EmpName, e.Sal
FROM Emp AS e INNER JOIN MyIds AS a ON e.EmpId = a.MyId
ORDER BY a.Position
Vous pouvez utiliser charindex Code> fonction de manière étrange: recherchez l'ID dans la liste séparée des virgules et commandez le résultat par la position.
Considérez cette liste par exemple résultat: p> 10,9,5,7,3,8 code> ... Le sous-chaîne 10 apparaît à 1 st sup> tandis que 9 apparaît à 4 < sup> th sup>. Commandez simplement par la position de sous-chaîne. P>
Bien que cela soit définitivement un piratage, c'est le type de piratage qu'un problème comme celui-ci mérite - et celui que j'avais volontiers heureux pour une requête AD-Hock!
Le moyen le plus simple d'y parvenir est probablement d'utiliser un constructeur de valorisation de table comme une expression de table contenant les identifiants avec une valeur de tri, puis commandez sur cette valeur:
Select
Emp.EmpId, Emp.EmpName, Emp.Sal
from
Emp
Inner Join
(
Values
(10, 1),
(9, 2),
(5, 3),
(7, 4),
(3, 5),
(8, 6)
)
EmpIds (EmpId, Sort)
On
Emp.EmpId = EmpIds.EmpId
Order By
EmpIds.Sort Asc
qu'est-ce que vous obtenez de cette requête
dans la clause code> ne fournit pas de moyen de modifier l'ordre des données.Comment appelez-vous cela? Il pourrait y avoir une façon dynamique de faire cela
@Ameydeshpande en ce moment, il affiche une commande ascendante. Comme 3, 5, 7, 8, 9, 10.
@Felixpamittan Pouvez-vous me donner un exemple pour le faire?
@Maciejlos alors comment puis-je obtenir le résultat selon mes besoins. Y a-t-il une autre façon de faire cela?
Si vous Besoin d'un ordre spécifique i>, alors vous doit I> B> Utilisez un ordre explicite
par code> - aucun moyen, pas de hack, pas d'astuce autour de ça. Il suffit de s'y habituer.