dedlfix: Eine SQL-Anweisung

Beitrag lesen

Hi!

ich bin überarbeitet, klassisches bespiel an etwas gedacht und was anderes gesagt. die parameter stimmen schon, nur die variable is REPLACE. und in der zweiten anweisung ist es auch ein einzelener string.

SELECT @v_ausgabe := '1,4,4568' Ausgabe, 1 Sortierung
UNION ALL
SELECT @v_ausgabe := REPLACE(@v_ausgabe, a.nr, ''), 2
FROM artikel a
WHERE a.nr IN ('1,4,4568'))
ORDER BY 2

Die WHERE-Zeile muss so aussehen, also Einzelwerte und kein String. Der String '1,2,4568' wird sonst in die Zahl 1 konvertiert und nur die Zeile a.nr=1 ausgewählt.

WHERE a.x IN (1,4,4568)

Außerdem gibt es ein Problem bei der Stringersetzung. Die Ausgabe ist nun wie folgt

+----------+------------+
| Ausgabe  | Sortierung |
+----------+------------+
| 1,4,4568 |          1 |
| ,4,4568  |          2 |
| ,,568    |          2 |
+----------+------------+

Zu sehen ist, die 4 verschwindet auch an Stellen, wo sie nicht soll, weil nicht die Zahlen im String sondern stets der gesamte String betrachtet wird. Abhilfe schafft, wenn man die Zahlen im Ausgangsstring eindeutig einrahmt. Ich wählte ein Leerzeichen als Anfang und ein Komma als Ende. Die Ersetzung wirft die Zahl und die "Begrenzungszeichen" raus, so arbeitet es nun ohne Fehler, und am Ende bleibt auch keine Kommawüste übrig. Und wenn man dann doch noch zwei Statements drausmacht, braucht man das Hilfskonstrukt der Sortierung nicht mehr.

SET @v_ausgabe := ' 1, 4, 4568,';
SELECT @v_ausgabe := REPLACE(@v_ausgabe, CONCAT(' ', a.nr, ','), '') Ausgabe
FROM artikel a
WHERE a.x IN (1,4,4568)
ORDER BY 1 DESC
LIMIT 1

Man muss nun aber entweder zwei Statements absetzen oder ein Multiquery bemühen (oder doch die Sortierung drin lassen). Auf alle Fälle bekommt man als Ergebnis einen String (wenn man noch ORDER und LIMIT hinzufügt ist es auch nur einer). Mit dem hat man vermutlich nicht viel gewonnen, denn er eignet sich nicht besonders als Kriterium für weitere Abfragen. Man könnte weitere Datensätze mit einer Im-String-enthalten-Prüfung selektieren (ebenfalls mit dem "Begrenzungszeichen-Trick"), doch performant ist was anderes. Es muss nämlich diese Prüfung auf jeden Datensatz einzeln angewendet werden, genauso wie es bei der ersten Berechnung der Fall war. Ein Index als Beschleuniger ist nicht verwendbar.

Ich denke, es ist günstiger (und vor allem verständlicher), die Abfragen zu trennen und etwas Hilfe der abfragenden Programmiersprache zu verwenden, die in Stringverarbeitung leistungsfähiger ist als ein DBMS.

Lo!