Ankündigung

Einklappen
Keine Ankündigung bisher.

RegEx

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • RegEx

    Hallo Zusammen,

    ist es möglich in einem Query mithilfe von RegEx einen bestimmten Wert rauszupicken?

    Folgendes Beispiel:
    Id nummer bezeichnung name
    1 12345 A ich bin A
    2 12345678999-1 B Ich bin B
    3 12345-P C Ich bin C
    4 A56748 A Ich bin D
    5 99987 A Ich bin E
    6 12345678999 B Ich bin A
    Ziel: Den Namen von z.B. A ausgeben lassen.

    Ich habe nun folgende Werte die für den Query übergeben werden: Bezeichnung(A) und Nummer(123-45)
    Eigentlich ist 123-45 A12345. Genauso hätte es auch umgekehrt in der DB stehen können.

    Ich hatte schon einige Ansätze versucht wie:

    Select Name From Tabelle WHERE Tabelle.Bezeichnung = Bezeichnung AND Tabelle.Nummer = Nummer REGEXP "MUSTER";
    und

    Select Name From Tabelle WHERE Tabelle.Bezeichnung = Bezeichnung AND Nummer REGEXP "MUSTER";

    Ich habe das Problem, dass mir nicht nur A ausgegeben wird, sondern auch D, weil es ja mit dem Muster passend ist, aber ich brauche nur das gesuchte, also A.
    Ich glaube ich stehe gerade auf den Schlauch oder ich habe einen Denkfehler...

    UPDATE: Jede Bezeichnung hat ein eigenes Muster.

    Vielen Dank für eure Hilfe!


  • #2
    Moin,
    Kannst du die Beispieldaten als Tabelle darstellen? So wie es ist ist es schwierig die Felder auseinander zu halten.
    Eigentlich ist 123-45 A12345. Genauso hätte es auch umgekehrt in der DB stehen können.
    Den Satz versteh ich nicht.
    'Eigentlich' ist auch immer ziemlich schlecht, weil wir nicht nachvollziehen können was das 'eigentlich' bedeutet.

    Warum würde denn D gefunden werden wenn du sowohl nach den Zahlen als auch nach der Bezeichnung suchst. Die Bezeichnung sollte D doch schon ausschließen.
    Relax, you're doing fine.
    RTFM | php.de Wissenssammlung | Datenbankindizes | Stay fit

    Kommentar


    • #3
      Sorry, ich habe es nun in eine Tabelle gestellt. Das eigentlich bezog sich darauf das die Werte zwar unterschiedliche Formate haben aber dennoch das selbe Resultat liefern sollen. Die Zahlen sind also identisch nur in einem anderen Format dargestellt wie in meinem Beispiel.

      Warum würde denn D gefunden werden wenn du sowohl nach den Zahlen als auch nach der Bezeichnung suchst. Die Bezeichnung sollte D doch schon ausschließen.
      Da hatte ich einen Fehler gemacht, welcher nun in der Tabelle korrigiert wurde. "Ich bin D" hat die selbe Bezeichnung wie "Ich bin A" dementsprechend haben sie beide das selbe Muster.

      Kommentar


      • #4
        Dann wirst du nicht drum herum kommen die Formate deiner Nummern anzugleichen, bzw. eines der beiden Formate in das andere zu überführen.

        Kommentar


        • #5
          Wie meinst du das mit überführen? Hast du ein Beispiel?

          Also was ich nicht machen kann ist das Format von dem übergebenden Wert ändern und auch nicht den in der Datenbank.

          Das was ich machen kann ist das gegebene so zu behandeln das ich das Ziel erreiche.

          Kommentar


          • #6
            Es ist etwas schwierig zu verstehen,meinst Du das so?:

            where bezeichnung ="A" and nummer = "12345" soll "ich bin A" ergeben

            where bezeichnung ="A" and nummer = "56748" soll "ich bin D" ergeben

            Denn ein Regex würd Dir ja immer "ich bin A" und "ich bin D" als Ergebnis liefern.


            Kommentar


            • #7
              Bring mal richtige Daten ins Spiel und nicht Pseudodaten, die auch noch falsch sind.

              Nach deiner missverständlichen Angabe gibt es zwei mal die gleiche Nummer, die du aber oben nicht so angegeben hast.
              "Ich bin D" hat die selbe Bezeichnung wie "Ich bin A" dementsprechend haben sie beide das selbe Muster.
              Dann werden auch beide gefunden, wie sollte das denn sonst gehen.

              Wenn du nun den ersten Wert haben willst, dann sortiere nach id und limitiere das Ergebnis mit Limit 1 aber so wird normalerweise nicht gesucht, dass heisst auch dass deine Tabellenstruktur falsch ist, da dies ja dann mehr oder weniger ein Zufallstreffer ist, der genau einmal zutrifft aber nicht immer richtig sein muss.

              Kommentar


              • #8
                Ich meinte es genauso wie es kaminbausatz beschrieben hat.
                Bei
                where bezeichnung ="A" and nummer = "12345" soll "ich bin A" ergeben
                und bei
                where bezeichnung ="A" and nummer = "56748" soll "ich bin D" ergeben.

                Wer jetzt aber auf die Idee kommt, "nimm doch einfach immer den Buchstaben vor dem Querystatment raus", dass ist auch nicht möglich, weil...
                Es kann auch den umgekehrten Fall geben (siehe neue Tabellezeile "Ich bin E")


                protestix

                Nach deiner missverständlichen Angabe gibt es zwei mal die gleiche Nummer, die du aber oben nicht so angegeben hast.
                Gehst Du von einer gleichen Nummer aus wegen der Aussage:
                "Ich bin D" hat die selbe Bezeichnung wie "Ich bin A" dementsprechend haben sie beide das selbe Muster.
                ?
                Weil ich dort schreibe das beide das selbe Muster (RegEXP) haben.

                Ein Beispielmuster wäre:
                ^(00)?[0-9]{3}(-)?[0-9]{3}$ Um z.B. solche Werte zu finden: 00123456 123456 123-456
                Hier sieht man das alle 3 Möglichkeiten die Zahl "123456" enthalten.

                Ich wäre für alle Vorschläge offen, wenn es nicht rein über das query geht, dann auch gerne in kombination mit PHP.

                Kommentar


                • #9
                  Edit2: Die Bezeichnung in der Spalte 2 hat wohl nichts mit mit den Buchstaben in nummer zu tun?

                  Deshalb noch mal von vorne:
                  - behandle deine zu übergebende Nummer per PHP soweit wie möglich vor ( - und Vornullen Entfernen), so das du reine Ziffernfolgen übergibst

                  Jetzt die Frage: Was steht für die 2. Zeile mit '987B79' an Informationen zur Verfügung? Nur eine nummer 98779 ?
                  jspit.de

                  Kommentar


                  • #10
                    Und was ist wenn sich in der Datenbank gerade dieses Format befindet? Dann wird es wieder nicht erkannt, weil ich A12345 übergebe und in der DB steht sie unter dem Format 123-45. Es soll nachher möglich sein die Werte aus einer .csv datei mit den Werten aus der DB zu matchen.
                    Das Hauptproblem ist ja, die ZAHL aus den verschiedenen Formaten zu erhalten.


                    Hier nochmals um es zu verdeutlichen ein etwas anderes Beispiel (Tabelle nochmals aktualisiert):

                    Es geht darum, dass man zu einer gegebenen Nummer und Bezeichnung einen Name identifizieren kann.

                    Jede Nummer gehört zu genau einer Bezeichnung und Namen. Dadurch lässt sich der Name dann ja auch genau ermitteln.

                    Um es Deutlicher zu machen, hier einmal der Name ich bin A

                    ich bin A hat eine Nummer bei der Bezeichnung A. In der Datenbank haben wir die Nummer A12345. Wobei Diese auch mittels 12345 eine gültige Nummer wäre.

                    ich bin A hat außerdem eine Nummer beim der Bezeichnung B. 11-12345678999. In der Datenbank steht 12345678999,

                    will aber auch mit der Eingabe von 11-123456789 oder 12345678999-1 den Namen finden können.

                    Die Nummer kann also immer in dem Format '11-'' Gefolgt von 11 weiteren Zahlen oder 11 Zahlen gefolgt von '-1' angegeben werden (Das gilt nur für Bezeichnung B, Bezeichnung A hat wieder ein anderes Muster/Format)

                    Kommentar


                    • #11
                      So etwas ähnliches hatten wir kürzlich hier, evtl. ist das hilfreich:

                      https://www.php.de/forum/webentwickl...71#post1514171

                      Kommentar


                      • #12
                        yugox Du hast meine letzte Frage noch nicht beantwortet. Welche Vorgaben für die nummer sind möglich, um '987B79' und damit 'Ich bin B' in der Datenbank zu finden?

                        Das Regex-Problem unter Mysql ist, das per Regex nur auf Muster geprüft werden kann, nicht aber Zeichenketten manpuliert werden können, um z.B. Werte rauszupicken.
                        jspit.de

                        Kommentar


                        • #13
                          jspit

                          Für die Bezeichnung B gäbe z.B. es nun die Eingabemöglichkeit 987B79, 98779, 987-79.
                          Vielleicht ist RexEx auch der falsche weg...

                          kaminbausatz

                          Danke dafür, ich werde es mir mal anschauen, vielleicht ist das ein passender Ansatz.

                          Kommentar


                          • #14
                            Zitat von yugox Beitrag anzeigen
                            Die Nummer kann also immer in dem Format '11-'' Gefolgt von 11 weiteren Zahlen oder 11 Zahlen gefolgt von '-1' angegeben werden (Das gilt nur für Bezeichnung B, Bezeichnung A hat wieder ein anderes Muster/Format)
                            Steht im direkten Widerspruch zu der Aussage #13. Welches Format gilt denn nun für Bezeichnung B ?
                            kaminbausatz : Ich fürchte mit einer ähnlichen Nutzerfunktion allein ist das Problem hier auch nicht lösbar.
                            jspit.de

                            Kommentar


                            • #15
                              Zitat von jspit Beitrag anzeigen
                              Ich fürchte mit einer ähnlichen Nutzerfunktion allein ist das Problem hier auch nicht lösbar.
                              Ich glaube auch nicht, weil mit jedem Post noch eine anderes Kriterium hinzu kommt....

                              Kommentar

                              Lädt...
                              X