Rolf b: sql: Sortierung

Beitrag lesen

Hallo Lukas,

wenn Du Lieferanten hast, deren Artikelnummern nicht rein numerisch sind, wie stellst Du Dir dann eine Sortierung nach numerischer Reihenfolge auch nur ansatzweise vor? Ein Lieferant hat numerische Artikelnummern, die sortierst Du numerisch, der andere hat mixed, die sortierst Du alphabetisch? Das macht die Sache SEHR schwierig.

Du bist bisher nicht auf den Vorschlag eingegangen, das Problem durch Splitten der Artikelnummer Column in VARCHAR-Columns Lieferantenkürzel und LieferantenArtikelnummer zu lösen. Magst Du uns erklären, warum Du das nicht willst? Es ist deutlich einfacher (und auch fixer), bei Bedarf

SELECT CONCAT(Lieferantenkuerzel, '-', LieferantArtikelnummer) AS Artikelnummer, ...

zu schreiben und die Felder beim Sortieren nicht zurückgewinnen zu müssen.

Deine bisherigen Splitversuche zeigen dazu noch, dass Du weitere Anomalien zu befürchten hast. Was ist denn, wenn der Lieferant Dir eine Artikelnummer mit "-" drin schickt? In dem Moment holst Du Dir nur den Teil vor dem Lieferanten-Bindestrich. Wenn du ans DB Modell nicht heran kannst oder willst, kannst Du dann ein Extrafeld in der Query aufnehmen?

So:

SELECT Lieferant, Artikelnummer, Dings, Bums, Foo, LOCATE('-', Artikelnummer) AS strichpos
FROM tabelle
WHERE ...
ORDER BY Lieferant, LEFT(Artikelnummer, strichpos-1), SUBSTR(Artikelnummer, strichpos+1)

Damit geht's zuverlässig und vermutlich deutlich fixer als mit SUBSTRING_INDEX.

Die "richtige" Sortierung der Lieferanten-Artikelnummern bekommst Du so natürlich auch noch nicht, und es ist auch nicht zielführend, numerisch zu sortieren wenn Du Lieferanten mit alphanumerischen Artikelnummern hast. Statt dessen solltest Du die ArtNr rechtsbündig ausrichten, Du musst Dir dann nur eine maximale Länge festlegen. Mal angenommen, das wäre 10, dann geht's so:

SELECT Lieferant, Artikelnummer, Dings, Bums, Foo, LOCATE('-', Artikelnummer) AS strichpos
FROM tabelle
WHERE ...
ORDER BY Lieferant, LEFT(Artikelnummer, strichpos-1), LPAD(SUBSTR(Artikelnummer, strichpos+1), 10, '0')

Rolf