2008-12-29 8 views
12

J'ai une requête sql (utilisant Firebird comme RDBMS) dans laquelle j'ai besoin de classer les résultats par un champ, EDITION. J'ai besoin de commander par le contenu du domaine, cependant. c'est-à-dire que "NE" passe en premier, "OE" passe en deuxième position, "OP" passe en troisième position et les blancs en dernier. Malheureusement, je n'ai aucune idée de comment cela pourrait être accompli. Tout ce que j'ai fait est ORDER BY [FIELD] ASC/DESC et rien d'autre.Commande de requête SQL par des valeurs de champs spécifiques

Des suggestions? Edit: Je devrais vraiment clarifier: j'espérais juste en savoir plus ici. Je l'ai maintenant que j'ai juste plusieurs instructions select définissant ce qui doit être montré en premier. La requête est assez grand et j'espère vraiment apprendre peut-être une façon plus effecient de faire ceci: exemple:

SELECT * FROM RETAIL WHERE MTITLE LIKE 'somethi%' AND EDITION='NE' 
UNION 
SELECT * FROM RETAIL WHERE MTITLE LIKE 'somethi%' AND EDITION='OE' 
UNION 
SELECT * FROM RETAIL WHERE MTITLE LIKE 'somethi%' AND EDITION='OP' 
UNION (etc...) 
+0

N l'une des solutions suggérées nécessite plusieurs sélections/unions. Ils devraient tous être beaucoup plus rapide et facile à maintenir, et la requête sera beaucoup plus facile à lire. –

+0

Je vais avec Peter LaComb sur celui-ci. Pourquoi utilisez-vous UNIONs? Il n'y a pas besoin J'irais avec SELECT * FROM Retail WHERE MTITLE COMME «Quelque chose» et ÉDITION EN («NE», «OE», «OP», «») ORDRE PAR ÉDITION DE CAS Quand «NE» Puis 1 Quand 'OE' Puis 2 Quand 'OP' Puis 3 Else 4 Fin – Pulsehead

+0

@Pulsehead vous pouvez trouver la réponse à pourquoi j'aurais utilisé des syndicats quelque part dans cette question très StackOverflow de ne pas savoir la meilleure façon de commander des champs. – Cyprus106

Répondre

40
Order By Case Edition 
    When 'NE' Then 1 
    When 'OE' Then 2 
    When 'OP' Then 3 
    Else 4 End 
+0

OOH! Plus rationalisé que comment je le fais. Je vais devoir me souvenir de votre solution. – Pulsehead

+0

En effet - je n'avais pas vu cette syntaxe auparavant. –

+0

Case est une chose merveilleuse –

5

Ajouter ces valeurs à une autre table avec une colonne numérique pour leur rang:

Edition Rank 
NE  1 
OE  2 
OP  3 

Rejoindre les tables et trier dans le champ RANK.

+0

Exactement. Si ce n'est pas un besoin permanent ou change souvent, l'OP peut utiliser une variable de table/table temporaire. – StingyJack

5
SELECT 
    /*other fields*/ 
    CASE WHEN 'NE' THEN 1 
    WHEN "OE" THEN 2 
    WHEN "OP" THEN 3 
    ELSE 4 
END AS OrderBy 
FROM 
    /*Tables*/ 
WHERE 
    /*conditions*/ 
ORDER BY 
    OrderBy, 
    /*other fields*/ 
+0

Battez-moi au coup de poing, +1. –

+0

Merci. Heureux de savoir que d'autres utilisent ce hack/kludge! me fait sentir comme un meilleur programmeur/dba. – Pulsehead

+0

Au moment où j'ai commencé la commande par SO m'a prévenu de 3 réponses. –

2

Essayez:

select * 
from MyTable 
order by 
case [FIELD] 
    when 'NE' then 1 
    when 'OE' then 2 
    when 'OP' then 3 
    when '' then 4 
    else 5 
end 
0

Essayez ceci:

ORDER BY FIND_IN_SET(EDITION, 'NE,OE,OP,') 
+0

FIND_IN_SET() ne fonctionne pas dans SQL Server 2005. Pouvez-vous me dire comment vous l'avez fait? J'ai une solution kludge, mais je suis toujours à la recherche d'une solution plus élégante. – Pulsehead

+0

CHARINDEX() fonctionnerait. – recursive

0
CREATE TABLE #TMP 
(
     ID INT IDENTITY(1,1), 
     NAME VARCHAR(100), 
) 

INSERT INTO #TMP 
SELECT 'ASHISH' 
UNION ALL 
SELECT 'CHANDAN' 
UNION ALL 
SELECT 'DILIP' 
UNION ALL 
SELECT 'ESHA' 
UNION ALL 
SELECT 'FIZA' 
UNION ALL 
SELECT 'MAHESH' 
UNION ALL 
SELECT 'VIPUL' 
UNION ALL 
SELECT 'ANIL' 

-- I want to sort NAME column from value 'DILIP' then query will be as bellow 

SELECT * FROM #TMP ORDER BY CASE WHEN NAME='DILIP' THEN '1' ELSE NAME END ASC 

DROP TABLE #TMP 

Pour plus de détails click here