7
votes

Ordre d'affichage d'une requête SQL sans commande par clause

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 commentaires

qu'est-ce que vous obtenez de cette requête


dans la clause 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 , alors vous doit Utilisez un ordre explicite par - aucun moyen, pas de hack, pas d'astuce autour de ça. Il suffit de s'y habituer.


7 Réponses :


13
votes

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;


0 commentaires

7
votes

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. XXX

Essayez ceci.


0 commentaires

1
votes

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


0 commentaires

0
votes

La requête suivante vous donnera le résultat exact (sans commande par): xxx


0 commentaires

0
votes

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


0 commentaires

2
votes

Vous pouvez utiliser charindex 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 10,9,5,7,3,8 ... Le sous-chaîne 10 apparaît à 1 st tandis que 9 apparaît à 4 < sup> th . Commandez simplement par la position de sous-chaîne. xxx

résultat: xxx


1 commentaires

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!



0
votes

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


0 commentaires