dedlfix: Eine SQL-Anweisung

Beitrag lesen

Hi!

[...] hier mal mein lösungsansatz.

Funktioniert aber in der Form nicht.

man kann sich eine variable zunutze machen, die man in die abfrage mit einbaut. in ersten ergebnisdatensatz wird die variable mit dem array initialisiert,

SQL kennt keine Arrays. Ich schlage vor, wir bleiben mal für das Verständnis bei möglichst korrekten Bezeichnungen (zumindest beim Versuch, sie zu verwenden). Es ist nur ein String mit kommaseparierten Zahlen, also ein skalarer Wert / ein einteiliges Datum.

ich kenne den mysql dialekt dazu nicht genau, deswegen verwende ich ein wenig speudo code.

Kein Problem, ich übersetzt das mal, soweit ich deine Intention verstehe.

SELECT v_ausgabe = '1,4,4568'
FROM dual

Die Pseudo-Tabelle dual gibt es (immer noch) nicht. In dem Fall einfach die FROM-Klausel weglassen (plus angepasste Variablenschreibweise).

SELECT @ausgabe := '1,4,4568'

Zusatzfrage: Wie unterscheidet Oracle einen Vergleich (=) von einer Zuweisung (ebenfalls =) und einen Variablennamen von einem Spaltennamen?

SELECT v_ausgabe = '1,4,4568' Ausgabe, 1 Sortierung
FROM dual d
ORDER BY 2

Da nun ein Union folgt, muss dieses SELECT-Statement mit dem ORDER BY drin geklammert werden, ansonsten darf das ORDER BY nur am Ende stehen und wirkt auf die unionisierte Ergebnismenge.

(SELECT @v_ausgabe := '1,4,4568' Ausgabe, 1 Sortierung
ORDER BY 2)

UNION ALL
SELECT v_ausgabe = SUBSTR(v_ausgabe, a.nr, ''), 2
FROM artikel a
WHERE a.nr IN ('1,4,4568')
;

Damit ergibt sich:

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

Sollte das in dem zweiten Statement ebenfalls eine Zuweisung sein oder doch ein Vergleich? Soll der Wert für den IN-Operator ebenfalls ein einzelner String sein? Vermutlich nicht.

jetzt kommt die eigentliche tabelle mit rein und der trick ist mit substr zu arbeiten. damit kannst du die werte rausfiltern, die matchen.

SUBSTR() arbeitet unter MySQL mit einem String als erstem Argument und einer Positionsangabe als zweitem Argument, plus einem optionalen dritten Argument für eine Längenangabe. Außer dem ersten Argument sind die anderen nummerische Argumente. Die in a.nr enthaltene Zahl ist als Positionsangabe nicht verwendbar, das Leerzeichen als Länge auch komisch. Was also meinst du mit dieser Funktion, beziehungsweise wie arbeitet sie in dem von dir verwendeten Dialekt wirklich? (Ich konnte keinen gravierenden Unterschied zu MySQL feststellen.

Das Ergebnis ist jedenfalls:

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

Lo!