4 Stimmen

Wie erhält man in Oracle 10g ein sortiertes Ergebnis auf der Grundlage der Wohnadresse?

Ich möchte die Oracle 10g-Datenbank abfragen und das Ergebnis auf der Grundlage der Wohnadresse in aufsteigender oder absteigender Reihenfolge erhalten. Das Problem ist, dass die Wohnadressen zu diesem Zeitpunkt in Form von 110C oder 200D vorliegen, so dass ich nach sql "order by" asc oder desc das Ergebnis als 200D vor 20 erhalte. zum Beispiel, wenn die Adressen 10 110 112 200D 232 95 20 100A 1050 944 sind

In aufsteigender Reihenfolge ergibt das:-

 10 100 100A 1050 110 112 20 200D 232 944 95

Das Problem ist, da die Adressen Zeichen enthalten, kann ich sie nicht als Ganzzahlen oder Zahlen betrachten, sondern muss sie als String betrachten.

5voto

Adriano Carneiro Punkte 56027

Verwenden Sie reguläre Ausdrücke:

Warnung! Möglicherweise nicht funktionierender Code voraus. Ich habe im Moment keine Oracle-Instanz, gegen die ich ihn testen kann.

SELECT YourAddress
FROM YourTable
order by TO_NUMBER(REGEXP_SUBSTR(AddressColumn, '^[0-9]+'));

REGEXP_SUBSTR findet die Teilzeichenkette der Zahl, mit der die Adresse beginnen soll, wandelt sie in eine reelle Zahl um und ordnet sie nach ihr.

Achtung: Sie müssen die Abfrage verbessern, um Fälle zu behandeln, in denen eine Zahl nicht vorhanden ist. Mit dieser Antwort können Sie jedoch sehr gut beginnen.

Wenn Sie eine Feinabstimmung der Abfrage benötigen, sollten Sie die folgenden Ressourcen nutzen:

Und, ja, REGEXP_SUBSTR ist in Oracle 10g verfügbar.

2voto

Justin Cave Punkte 220606

Die auf regulären Ausdrücken basierenden Lösungen sind eleganter. Wenn Sie jedoch zuerst nach der numerischen Komponente mit einer numerischen Sortierung und dann nach der Zeichenkomponente mit einer Zeichensortierung sortieren möchten, können Sie auch die TRANSLATE Funktion.

SQL> ed
Wrote file afiedt.buf

  1  with x as (
  2    select '10' addr from dual union all
  3    select '100' from dual union all
  4    select '100A' from dual union all
  5    select '1050' from dual union all
  6    select '110' from dual union all
  7    select '200D' from dual union all
  8    select '20' from dual
  9  )
 10  select addr,
 11         to_number( translate( addr,
 12                               '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ',
 13                               '1234567890' ) ) addr_num,
 14         translate( addr,
 15                    'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890',
 16                    'ABCDEFGHIJKLMNOPQRSTUVWXYZ') addr_str
 17    from x
 18   order by to_number( translate( addr,
 19                                  '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ',
 20                                  '1234567890' ) ),
 21            translate( addr,
 22                       'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890',
 23*                      'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
SQL> /

ADDR   ADDR_NUM ADDR_STR
---- ---------- ----------------
10           10
20           20
100A        100 A
100         100
110         110
200D        200 D
1050       1050

7 rows selected.

1voto

Jim Garrison Punkte 83143

Die einzige Möglichkeit, dies zu bewerkstelligen, besteht darin, die Straßennummern in einen numerischen und einen nichtnumerischen Teil zu zerlegen und sie in separaten Spalten zu speichern, so dass Sie zuerst den numerischen Teil (als Zahl) und dann den nichtnumerischen Teil indizieren (oder danach ordnen) können. Es ist vielleicht möglich, einen Ausdruck zu schreiben, der dies tut, aber dann geht die Indizierung verloren (falls das wichtig ist).

In Oracle 11 gibt es eine REGEXP_SUBSTR-Funktion, die dazu verwendet werden kann, aber ich bin mir nicht sicher, ob sie in Oracle 10g existiert.

0voto

Ivan Punkte 3479

Ich habe keine Erfahrung mit Oracle, aber im Allgemeinen mit SQL könnte so etwas helfen:

ORDER BY CAST(house AS integer), house

So im Grunde bestellen Sie von Integer-Teil des Feldes zuerst (CAST sollte alle nachgestellten nicht numerischen Zeichen ignorieren), und wenn sie gleich sind, sollte es sie als eine Zeichenfolge vergleichen, so 100A vor 100b sein würde

Offenbar funktioniert dies in Oracle nicht. Siehe Kommentare

0voto

MatBailie Punkte 77040

Soweit ich weiß, haben Sie zwei grundlegende Möglichkeiten:
1. Das Feld in ein einheitliches Format zwingen
2. Trennen Sie die numerischen und nicht-numerischen Teile

Bei Option eins würden Sie Folgendes ändern '10' zu sein '00010-' und '100A' zu sein '00100A' , usw. Sie werden sich dann von selbst ordnen.

Bei Option zwei würden Sie Folgendes ändern '10' zu sein (10,'') und '100A' zu sein (100,'A') , usw. Ordnen Sie dann nach den beiden Teilen (numerisch und nicht-numerisch) getrennt.

In jedem Fall müssen Sie ein wenig mehr über die endgültigen Merkmale der Daten wissen (oder uns diese mitteilen). (Ist das Muster immer [numerisch][alphanumerisch], ist der [alphanumerische] Teil immer 1 Zeichen lang, haben Sie jemals Gebäudenamen, usw.).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X