Die Kombination von Verkettung mit ORDER BY
Habe ich Schwierigkeiten in der Kombination von Verkettung mit order by in Postgre (9.1.9).
Sagen wir mal, ich habe einen Tabellenrahmen mit 3 Feldern:
Table "borders"
Column | Type | Modifiers
---------------+----------------------+-----------
country1 | character varying(4) | not null
country2 | character varying(4) | not null
length | numeric |
Den ersten beiden Feldern sind die codes der Länder und die Dritte ist die Länge der Grenze zwischen diesen Ländern.
Der Primärschlüssel definiert ist, auf die ersten beiden Felder.
Ich brauche, um zu Komponieren, ein wählen Sie eine Spalte, die würde haben einzigartige Werte für die gesamte Tabelle, die neben dieser Spalte sollte ausgewählt werden, in absteigender Reihenfolge.
Dafür habe ich verketten Sie die key-Felder mit einem Trennzeichen, da sonst zwei verschiedene Zeilen erhalten könnte, das gleiche Ergebnis, wie (AB, C und A, BC).
Also ich habe die folgende Abfrage ausführen:
select country1||'_'||country2 from borders order by 1;
Aber im Ergebnis sehe ich, dass das ' _ ' - Zeichen weggelassen von der Sortierung.
Die Ergebnisse sieht wie folgt aus:
?column?
----------
A_CH
A_CZ
A_D
AFG_IR
AFG_PK
AFG_TAD
AFG_TJ
AFG_TM
AFG_UZB
A_FL
A_H
A_I
.
.
Können Sie sehen, dass das Ergebnis sortiert wird, als wenn die '_' nicht existiert, in die Saiten.
Wenn ich einen Buchstaben (z.B. 'x') als Trennzeichen - die Reihenfolge korrekt ist. Aber ich muss einige spezielle Zeichen, die nicht angezeigt wird in der country1 und ländern2 Felder, zu vermeiden Streitigkeiten.
Was soll ich tun, um die ' _ ' - Zeichen zu berücksichtigen, die während der Sortierung.
BEARBEITEN
Es stellte sich heraus, dass die Verkettung hat nichts mit dem problem zu tun. Das problem ist, dass die Bestellung, indem Sie einfach ignoriert ' _ ' - Zeichen.
- Die
_
Charakter relevant sein können für die Sortierung oder nicht, je nach Sortierung-Einstellungen. - Danke, das ist etwas, was ich nicht wusste, und hat es von den Antworten hier.
Du musst angemeldet sein, um einen Kommentar abzugeben.
sql fiddle demo
Noten nach Diskussion in den Kommentaren:
1.)
COLLATE "C"
gilt in derORDER BY
- Klausel so lange, wie es Referenzen der Ausdruck in derSELECT
Klausel durch Positionsparameter oder alias. Wenn Sie wiederholen Sie den Ausdruck inORDER BY
Sie auch brauchen, um zu wiederholen dieCOLLATE
- Klausel, wenn Sie wollen, um Einfluss auf die Sortierreihenfolge entsprechend.sql fiddle demo
2.) In Sortierungen wo
_
hat keinen Einfluss auf die Sortierreihenfolge, es effizienter zu nutzen Nebel der Abfrage, noch mehr so, weil das macht die Verwendung des vorhandenen index (primary key is defined on the first two fields
).Allerdings, wenn
_
darauf Einfluss hat, braucht man zum Sortieren der kombinierte Ausdruck:sql fiddle demo
Query-performance (getestet in Postgres 9.2):
sql fiddle demo
PostgreSQL-Sortierung-Unterstützung im Handbuch.
primary key is defined on the first two fields
. Diese Abfrage konnte nicht verwenden Sie den index, während der Nebel die Abfrage würde.'_'
auf die Sortierreihenfolge. Aber wirklich, das muss gehen, in der Antwort, nicht nur in die Kommentare! Ich ammended die Antwort und fügte einige info zu klären, es.ORDER BY
wiederholt Ausdruck ohneCOLLATE
. Siehe die Erklärung, die ich Hinzugefügt, um die obige Antwort. Alternative zu testen mit 50k Zeilen: sqlfiddle.com/#!12/8122d/1Nur um von den beiden Spalten:
Es sei denn, Sie Aggregate oder windows, PostgreSQL erlaubt order by-Spalten, auch wenn Sie nicht in der SELECT-Liste.
Wie vorgeschlagen in einer anderen Antwort können Sie auch ändern Sie die Sortierung der kombinierten Spalte, sondern, wenn Sie können, die Sortierung auf Ebene der Spalten ist schneller, vor allem, wenn Sie über einen index auf Sie.
Was passiert, wenn Sie das folgende tun?
Mein wissen auf, um durch den 1 nur ist eine Ordnungszahl sortiert. Es wird nicht alles tun, auf verketteten Spalten. Zugegeben, ich spreche von SQL Server wissen, so lassen Sie mich wissen, wenn ich Weg Basis.
Bearbeitet: Ok; nur sah Parado ' s post, wie ich mir geschrieben. Vielleicht könnten Sie eine Sicht erstellen, die aus dieser Abfrage (gib es eine Spalte Namen) und dann requery den Blick, um nach dieser Spalte? Oder tun Sie das folgende:
1