Liza: in MySQL Srings in Teilstrings konvertieren

Hallo,

mit der Funktion FIND_IN_SET(str,strlist)
läßt sich aus 'strlist', einem Einzelstring mit durch Kommata getrennten Daten, die Position eines Teilstrings ausfragen.

Beispiel: SELECT FIND_IN_SET('b','a,b,c,d');
  -> 2

Dazu äquivalent möchte ich nun aus einem _Einzelstring_ mit durch Kommata getrennten Daten den Wert an einer bestimmten Position ausfragen.

Erläuterung: SELECT WUNSCHFUNKTION(2,'a,b,c,d');
  sollte 'b' ergeben

Gefunden habe ich die Funktion ELT(N,str1,str2,str3,...), die einen Einzelstring aus einer Kette aus Einzelstrings zurückgibt.

Beispiel: SELECT ELT(2, 'ej', 'Heja', 'hej', 'foo');
  -> 'Heja'

Hier nun die Frage: Gibt es eine Funktion, die meiner WUNSCHFUNKTION gleicht, oder wie bekomme ich aus meinem _Einzelstring_ mit seinen kommaseparierten Werten in SQL eine Kette an Einzelstrings (in PHP wäre das 'explode()')?

Ich hoffe, ich hab mich nicht zu umständlich ausgedrückt und danke euch schon mal im Vorhinein für eure Tipps.

Ciao
Liza, die langsam am verzweifeln ist. :-(

  1. Hello Liza,

    Erläuterung: SELECT WUNSCHFUNKTION(2,'a,b,c,d');
      sollte 'b' ergeben

    Nun hast Du mich wirklich verwirrt eben. Aber ein SELECT wäre hier gar nicht sinnvoll, da in einem SET in der DB unter dem selben Index immer das Selbe stehen muss.

    Es wird daher wohl besser

    show columns from tabelle;

    in Frage kommen und dann vom entsprechenden Feld den Type auslesen

    set('EINS','ZWEI','DREI','VIER','FÜNF')

    und das dann zerlegen mit Regular Expressions.

    Bei Abrage eines enum oder set liefert MySQL tatsächlich den gewählten Wert oder die Liste der gewählten Werte, bei set in der Reihenfolge der Definition, aber keinesfalls auf dem richtigen Platz. Die Werte rücken also auf.

    select SETTEST ergibt also z.B. "EINS,DREI,VIER"
    (SETTEST heißt hier mein Feld vom Typ Set)

    Grüße

    Tom

    1. Hallo Tom,

      danke für deine Antwort, aber ich glaube, wir reden etwas aneinander vorbei :-)
      Ich kann dir ja mal das konkrete Beispiel beschreiben. Ich habe eine DB in der 2 Felder existieren, in denen jeweils unterschiedliche Zahlenketten als ein String stehen.

      ___________________________
        |   Feld 1   |    Feld 2    |
        |____________|______________|
        |            |              |
        |  1,5,6,4   |   4,6,8,9    |
        |____________|______________|
        |            |              |
        |  4,6,7,1   |   1,9,6,7    |
        |____________|______________|

      Mit der Funktion FIND_IN_SET('b','a,b,c,d') frage ich als Bedingung im WHERE-Bereich aus, ob eine spezielle Zahl im Feld 1 existiert.
      Also:

      SELECT Feld 3, Feld 4 WHERE FIND_IN_SET(5,Feld 1)

      Das funktioniert auch und würde im Beispiel auf den ersten Datensatz zutreffen. Die Funktion FIND_IN_SET () gibt in diesem Fall 2 zurück. Nun möchte ich, dass wenn der Datensatz in Feld 1 die ausgefragte Zahl besitzt, er gemäß der Zahl in Feld 2, die an der gleichen Position wie die Ausgefragte in Feld 1 steht, sortiert wird.

      An der Beispielsabfrage soll also noch ein ORDER BY angehängt werden, das im ersten Datensatz die 2. Position der Zahlen in Feld 2 berücksichtigt.

      Viel verständlicher scheint mir meine Erklärung immer noch nicht gelungen zu sein ;-)

      Ciao
      Liza

      P.S: Es lag mir fern, dich zu verwirren. :-)

      1. Hello,

        ich war davon ausgegangen, dass Du da auch Felder von Typ SET hast, denn die Funktion find_in_set() ist eigentlich dafür gedacht. Kann man aber wohl auch für "normale" Strings verwenden. Set ist ja ein Untertyp von String.

        Da gibts noch eine Irre Funktion, deren Funktionsweise ich aber vorhin nicht so schnell durchschaut habe. Vielleicht passt die für dich:

        EXPORT_SET(x,s1,s1)

        Ich krieg nicht raus, was die Funktion macht. Aber es sieht sehr interessant aus ;-|

        Grüße

        Tom

  2. hi,

    Dazu äquivalent möchte ich nun aus einem _Einzelstring_ mit durch Kommata getrennten Daten den Wert an einer bestimmten Position ausfragen.

    Erläuterung: SELECT WUNSCHFUNKTION(2,'a,b,c,d');
      sollte 'b' ergeben

    ich denke, unter http://www.mysql.de/doc/de/String_functions.html solltest du fündig werden.
    SUBSTRING könnte dich besonders interessieren ...

    gruss,
    wahsaga

    1. Hallo wahsaga,

      danke für den Tipp. Hab natürlich in der englisch-sprachigen Variante gesucht, wußte aber gar nicht, dass es mitlerweile eine dt. Übersetzung gibt. Werde auch hier einmal suchen. Eventuell sind ja einige Dinge meinen beschränken Englischkenntnissen zum Opfer gefallen. ;-)

      Ciao
      Liza