2012-04-08 3 views
1

Dies funktioniert nicht in Postgres 8.4:SQL-Fehler, wenn ich unterschiedliche Reihenfolge von oben verwenden/unteren

SELECT DISTINCT col1 FROM mytable 
    ORDER BY UPPER(col1); 

aber dies funktioniert:

SELECT DISTINCT col1 FROM mytable 
    ORDER BY col1; 

Ich weiß, es könnte für die Datenbank etwas verwirrend sein ob zuerst DISTINCT und dann UPPER angewendet oder zuerst in UPPER konvertiert und dann DISTINCT angewendet wird. Basierend auf der Reihenfolge, wie es angewendet wird, kann ein anderes Ergebnis erzielt werden. Nicht sicher, ob der SQL-Standard etwas in dieser Hinsicht sagt.

Jede Hilfe wird sehr geschätzt.

+0

Welche Fehlermeldung erhalten Sie? Wenn es das ist, was ich denke, können Sie diese Abfrage verwenden - SELECT DISTINCT UPPER (Spalte1), Spalte1 FROM Meine Tabelle ORDER BY UPPER (Spalte1); –

+0

Der Fehler, den ich erhalte, ist: FEHLER: für SELECT DISTINCT, ORDER BY Ausdrücke müssen in der Auswahlliste erscheinen – user1318538

+0

Aber Ihre Lösung hat funktioniert! Vielen Dank. – user1318538

Antwort

3

Viele SQL-Engines erlauben nur das Sortieren nach ausgewählten Spalten. Also das Update, um das UPPER (col1) zur Auswahl hinzuzufügen.

SELECT DISTINCT UPPER(col1), col1 FROM mytable ORDER BY UPPER(col1) 
+1

Die [DISTINCT] -Klausel (http://www.postgresql.org/docs/current/interactive/sql-select.html#SQL-DISTINCT) und 'ORDER BY' müssen Vereinbaren Sie die ** ganz links ** Spalten. Es ist in vielen Fällen sinnvoll und sinnvoll, * zusätzliche * 'ORDER BY'-Spalten hinzuzufügen. –

0

stolperte über das gleiche Problem und in meinem Zusammenhang Folgendes war einfacher zu implementieren:

select * from (select distinct col1 from mytable) x order by upper(col1) 

Ich habe Mühe, keine Performance-Tests zu tun (in meinem Fall das Datenvolumen ist relativ niedrig), aber möglicherweise könnte dies sogar die Geschwindigkeit verbessern, da die Sortierung auf wesentlich weniger Daten stattfinden kann (Postgres doc sagt, dass die Sortierung vor der Anwendung von DISTINCT erfolgt, während der obige Weg zuerst DISTINCT, dann sort).

Verwandte Themen