Einen INT-Wert aus "String" herauslesen

MysterioJN

SQL-Guru
Beiträge
158
Moin zusammen,

steh auf dem Schlauch.

Folgende Gegebenheit in einer Tabelle:

Auflage (Spalte):
- Erstauflage
- 2. Auflage
- 3. Auflage
- ....
- 10. Auflage


Ich kann die Auflage so leider nicht sinnbehaftet sortieren. Sprich das Ergebnis wäre:
10. Auflage
2. Auflage
2. unveränderte Auflage
3. Auflage
...
Erstauflage


Wie bekomme ich es hin, das er mir in einer zusätzlich erzeugten Spalte nur eine auf zwei Zeichen beschränkte Zahl auswirft und entsprechend links mit "0" auffüllt wenn notwendig. Sonstige Textzeichen oder Satzzeichen einfach verwirft.

Sprich:
Erstauflage --> 01
2. Auflage --> 02
2. unveränderte Auflage --> 02
usw.

Dann könnte ich es im Nachgang entsprechend sortieren.


"Left" mit einbauen? Für jeden Fall einen CASE aufmachen, wäre problematisch, da die Texte der Auflagen stark variieren können/bzw. Rechtschreibfehler möglich wären. Daher soll er nur auf "Erstauflage" oder halt die Zahlen von Links achten und entsprechende Ergebnisse in einer neuen Spalte erzeugen.
 
Werbung:
Code:
SELECT *
FROM tabelle
ORDER BY left(replace(spalte,'Erstauflage','1. Auflage'),charindex('.',replace(spalte,'Erstauflage','1. Auflage'))-1), spalte
 
SELECT *

FROM aid_tab

ORDER BY left(replace(BstlAuflage,'Erstauflage','1. Auflage'),charindex('.',replace(BstlAuflage,'Erstauflage','1. Auflage'))-1), BstlAuflage



Meldung 537, Ebene 16, Status 2, Zeile 3

Ein ungültiger Längenparameter wurde an die LEFT- oder SUBSTRING-Funktion übergeben.
 
Dann gibt es vermutlich Datensätze wo BstlAuflage keinen Punkt enthält und nicht Erstauflage ist. Das kann man natürlich abfangen, man sollte sich aber erst die Ursache ansehen. Sind hier vielleicht Schreibfehler oder sowas enthalten?
 
Hmm hier mal der Inhalt (siehe Anhang).

Komma gibt es,
leere gibt es...

Glaub nicht, das wir es hinbekommen, dass wir eine saubere Spalte hinzufügen können, wo wirklich nur 01 bis 99 drin steht :-(

Danke übrigens für deine Hilfe!!
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    70 KB · Aufrufe: 3
Dann würde ich es anders machen:
Code:
SELECT   *
FROM   tabelle
ORDER BY (   CASE
       WHEN (  spalte LIKE '%.%'
       OR     spalte LIKE '%Erstauflage%' )
       AND     isnumeric(left(replace(spalte,'Erstauflage','1. Auflage'),charindex('.',replace(spalte,'Erstauflage','1. Auflage'))-1)) = 1
       THEN   cast(left(replace(spalte,'Erstauflage','1. Auflage'),charindex('.',replace(spalte,'Erstauflage','1. Auflage'))-1) AS INT)
       ELSE   0
       END ),
     spalte
Das kannst du dir auch im Select-Teil als Spalte anzeigen lassen und natürlich weiter modifizieren.
 
Genial. Der Select dauert zwar rund 13 Minuten bis dato, aber es kommt schon mal eine richtige Sortierung bei 1,47 Millionen Datensätze bei rum.
Problem, ich kann ihn in den Rund 27 Abfrage die auf die u.a. auf die Tabelle gezielt sind nicht immer diese Sortierung angeben. Allein aus Geschwindigkeitsgründen.
Erstauflage wandelt er aber bis dato nicht in 1. Auflage um. Oder noch besser in 01.Auflage.


Daher lass uns mal kurz einen Schritt zurückgehen, mit der Zielvorgabe eine neue Spalte zu erzeugen, mit dem Inhalt von zwei Stellen von links der anderen Spalte.

Bei LEFT(2) würde er mir folgendes Ergebnis ausgeben:
null
Er
1. (bis 9.)
10 (bis 99)

Sprich folgende Schritte notwendig:
1. 'Erstauflage' in '01. Auflage' umwandeln
2. Links zwei Zeichen übernehmen
3. von den übernommenen Zeichen den '.' löschen sofern vorhanden
4. bei den nun nur noch einstelligen Zahlen links eine 0 hinzufügen


Versteh mich nicht falsch, fühl dich nicht verpflichtet mir zu helfen bei meinem quatsch!!
Ich hätt ja nicht gedacht, das du dir schon solche Gedanken gemacht hast oder überhaupt jemand.

Daher, vielen Dank!

Ich schaue mir mal deinen Order by genauer an. Vlt. hilft der mir ja schon größtenteils.
 
EDIT: Sry, konnte das nicht editieren von vorher.

VERGISS ES. Habs falsch interpretiert.

Mein Ergebnis dank deines genialen Codes sieht wie im Anhang beigefügt aus.
Jetzt kann ich tadellos sortieren!!!


GANZ GANZ LIEBEN DANK!!
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    95,6 KB · Aufrufe: 1
Zuletzt bearbeitet:
Werbung:
Ja ist ja ein INT Wert den du sortierst, den musst du vorne schonmal nicht mit Nullen auffüllen. Bei einer Zeichenkette wäre das eventuell ein Problem.

Sollte das erste Sortierkriterium nichts sinnvolles liefern wird nach wie vor stumpf nach der Spalte sortiert. Du musst also nicht gleich alle Fälle abdecken.

Bei sovielen Datensätzen ist Geschwindigkeit natürlich ein Faktor. In dem Fall könnte man eine Spalte mit der "bereinigten Information" zur Sortierung einfügen.
 
Zurück
Oben