it-swarm.com.de

TSQL - Kann die Sortierreihenfolge definiert werden?

Ist es möglich, eine Sortierreihenfolge für die zurückgegebenen Ergebnisse zu definieren?

Ich möchte, dass die Sortierreihenfolge "Orange", "Apfel", "Erdbeere" nicht auf- oder absteigend ist.

Ich weiß, dass ORDER BY ASC oder DESC kann, aber gibt es ein DEFINIERTES ('orange', 'Apfel', 'Erdbeere') Ding?

Dies wird auf SQL Server 2000 ausgeführt.

22
Justin808

Es ist unglaublich klobig, aber Sie können eine CASE-Anweisung für die Bestellung verwenden:

SELECT * FROM Blah 
ORDER BY CASE MyColumn 
    WHEN 'orange' THEN 1 
    WHEN 'Apple' THEN 2 
    WHEN 'strawberry' THEN 3 
    END 

Alternativ können Sie eine sekundäre Tabelle erstellen, die das Sortierfeld und eine Sortierreihenfolge enthält.

TargetValue  SortOrder
orange       1
Apple        2
strawberry   3

Und verbinde deinen Tisch mit diesem neuen Tisch.

50

Verwenden Sie eine CASE-Anweisung :

ORDER BY CASE your_col
           WHEN 'orange' THEN 1
           WHEN 'Apple' THEN 2
           WHEN 'strawberry' THEN 3
         END 

Alternative Syntax mit einem ELSE:

ORDER BY CASE 
           WHEN your_col = 'orange' THEN 1
           WHEN your_col = 'Apple' THEN 2
           WHEN your_col = 'strawberry' THEN 3
           ELSE 4
         END 
10
OMG Ponies

Wenn dies nur von kurzer Dauer sein soll, verwenden Sie eine case-Anweisung. Wenn Sie jedoch der Meinung sind, dass es eine Weile dauern könnte und die Reihenfolge orange/Apple/strawberry immer sein wird (oder auch nicht - siehe unten), sollten Sie darüber nachdenken, Speicherplatz zu opfern, um etwas Geschwindigkeit zu gewinnen.

Erstellen Sie eine neue Spalte in Ihrer Tabelle mit dem Namen or_ap_st und füllen Sie sie mit einem Einfüge-/Aktualisierungs-Trigger mit der Nummer 1, 2 oder 3, abhängig vom Wert Ihrer Fruchtspalte. Dann indizieren Sie es.

Da sich die Daten in dieser Spalte nur ändern, wenn sich die Zeile ändert, ist dies der beste Zeitpunkt, dies zu tun. Die Kosten fallen dann eher bei einer kleinen Anzahl von Schreibvorgängen als bei einer großen Anzahl von Lesevorgängen an und werden daher über die select-Anweisungen amortisiert.

Ihre Anfrage wird dann blitzschnell:

select field1, field2 from table1
order by or_ap_st;

ohne zeilenweise Funktionen, die die Leistung beeinträchtigen.

Und wenn Sie auch andere Sortierreihenfolgen wünschen, habe ich die Spalte or_ap_st genannt. Sie können beliebig viele weitere Sortierspalten hinzufügen.

7
paxdiablo

Was ich in diesem Fall tue, ist

ORDER BY
  CASE WHEN FRUIT = 'Orange' THEN 'A' 
       WHEN FRUIT = 'Apple' THEN 'B'
       WHEN FRUIT = 'Strawberry' THEN 'C'
       ELSE FRUIT
END
2
turtlepick

Weiter von turtlepicks Antwort :

ORDER BY
  CASE WHEN FRUIT = 'Orange' THEN 'A' 
       WHEN FRUIT = 'Apple' THEN 'B'
       WHEN FRUIT = 'Strawberry' THEN 'C'
       ELSE FRUIT
  END

Falls Sie weitere Artikel in FRUIT haben und diese zufällig mit Buchstaben beginnen, die nach THEN-Schlüsselwörtern definiert sind, werden diese Artikel in der fest codierten Reihenfolge angezeigt. Zum Beispiel taucht Banane vor Strawberry auf. Sie können es mit umgehen

ORDER BY
  CASE
    WHEN FRUIT = 'Orange' THEN '.1'
    WHEN FRUIT = 'Apple' THEN '.2'
    WHEN FRUIT = 'Strawberry' THEN '.3'
    ELSE FRUIT
  END

Hier habe ich Zeichen mit niedrigeren ASCII Werten verwendet, in der Hoffnung, dass sie in FRUIT nicht am Anfang von Werten erscheinen.

1
Kuitsi

Fügen Sie der Tabelle einen Schlüssel hinzu (z. B. den Primärschlüssel fruit_id int identity (1,1)), um die Reihenfolge des Einfügens beizubehalten

create table fruit(fruit_id int identity(1,1) primary key, name varchar(50))
go

insert into fruit(name) values ('orange')
insert into fruit(name) values ('Apple')
insert into fruit(name) values ('strawberry')

select name from fruit

ergebnis:

orange
Apple
strawberry
0
The Danish

Nicht so häufig, aber für Einzelwertoperationen oder bestimmte Muster funktioniertREPLACEebenfalls

z.B.

DECLARE @Fruit TABLE (Fruit_Id INT IDENTITY(1, 1) PRIMARY KEY ,Name VARCHAR(50));

INSERT  INTO @Fruit (Name) VALUES  ('Orange');
INSERT  INTO @Fruit (Name) VALUES  ('Apple');
INSERT  INTO @Fruit (Name) VALUES  ('Strawberry');
INSERT  INTO @Fruit (Name) VALUES  ('__Pear');


SELECT * FROM @Fruit AS f
ORDER BY REPLACE(f.Name,'__','')



Fruit_Id    Name
----------- --------------------------------------------------
2           Apple
1           Orange
4           __Pear
3           Strawberry
0
Vland