2008-12-29 4 views
12

Ich habe eine SQL-Abfrage (mit Firebird als RDBMS), in dem ich die Ergebnisse von einem Feld, EDITION bestellen müssen. Ich muss jedoch nach dem Inhalt des Feldes bestellen. d.h. "NE" geht zuerst, "OE" geht an zweiter Stelle, "OP" geht an dritter Stelle, und Leerzeichen gehen zuletzt. Leider habe ich keine Ahnung, wie dies erreicht werden könnte. Alles, was ich je gemacht habe, ist ORDER BY [FIELD] ASC/DESC und sonst nichts.Reihenfolge der SQL-Abfrage nach bestimmten Feldwerten

Irgendwelche Vorschläge?

Edit: Ich sollte wirklich klarstellen: Ich hatte nur gehofft, hier mehr zu lernen. Ich habe es jetzt, dass ich nur mehrere Select-Anweisungen habe, die festlegen, was zuerst angezeigt werden soll. Die Abfrage ist ziemlich groß und ich war wirklich möglicherweise eine leistungsfähigere Art und Weise, dies zu tun zu lernen, der Hoffnung: Beispiel:

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 Eine der vorgeschlagenen Lösungen erfordert mehrere Auswahlmöglichkeiten/Vereinigungen. Sie sollten alle viel schneller und einfacher zu warten sein, und die Abfrage wird VIEL einfacher zu lesen sein. –

+0

Ich gehe mit Peter LaComb über dieses Thema. Warum verwenden Sie UNIONs? Es gibt keine Notwendigkeit Ich würde gehen mit SELECT * FROM Retail WHERE MTITLE WIE 'Somethi%' UND EDITION IN ('NE', 'OE', 'OP', '') ORDER BY CASE EDITION Wenn 'NE' Dann 1 Wenn 'OE' Dann 2 Wenn 'OP' Dann 3 Else 4 Ende – Pulsehead

+0

@Pulsehead können Sie die Antwort finden, warum ich irgendwo in dieser StackOverflow-Frage Gewerkschaften benutzt hätte, um nicht zu wissen, wie man Felder am besten bestellt. – Cyprus106

Antwort

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

OOH! Schneller als ich es mache. Ich muss mich an deine Lösung erinnern. – Pulsehead

+0

In der Tat - ich habe diese Syntax vorher nicht gesehen. –

+0

Fall ist eine wunderbare Sache –

5

Fügen Sie diese Werte auf eine andere Tabelle mit einer numerischen Spalte für ihren Rang:

Edition Rank 
NE  1 
OE  2 
OP  3 

Verbinden Sie die Tabellen und sortieren Sie nach dem RANK-Feld.

+0

Genau. Wenn es nicht permanent benötigt wird oder sich häufig ändert, kann das OP eine temporäre Tabelle/Tabellenvariable verwenden. – 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

Beat mich bis zum Schlag, +1. –

+0

Danke. Freut mich zu wissen, dass andere diesen Hack/Kludge benutzen! Ich fühle mich wie ein besserer Programmierer/dba. – Pulsehead

+0

Als ich mit der Bestellung begann, warnte mich SO vor 3 Antworten. –

2

Versuchen:

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

Versuchen Sie folgendes:

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

FIND_IN_SET() funktioniert nicht in SQL Server 2005. Können Sie mir sagen, wie Sie das getan haben? Ich habe eine Kludellösung, aber ich bin immer auf der Suche nach einer eleganteren Lösung. – Pulsehead

+0

CHARINDEX() würde funktionieren. – 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 

Weitere Einzelheiten click here