Nostra: liek "%_3";

Hallo,

ich möchte mit select * from kunden where strasse like "%_3"; alle Strassen die nur eine Drei als Hausnummer besitzen.

Momentan bekomme ich alle Datensätze in dessen Strasse überhaupt eine Drei steckt.

bis dann, Nostra

  1. Hallo,

    ich möchte mit select * from kunden where strasse like "%_3"; alle Strassen die nur eine Drei als Hausnummer besitzen.

    Das Zeichen '_' ist, wie auch das Zeichen '%', ein Platzhalter(Wildcard), und zwar für genau ein beliebiges Zeichen.
    Daher wird von der Datenbank obige LIKE-Bedingung als 'beginnend mit beliebig vielen beliebigen Zeichen, gefolgt von genau einem beliebigen Zeichen und dem ZEichen für 3' interpretiert.

    Wie man diese Wildcards so maskiert, dass diese Zeichen auch als String interpreetiert werden, kannst DU (hoffentlich) der Dokumenattion zur verwendeten Datenbank entnehmen.

    Grüße
      Klaus

  2. Hallo Nostra

    ich möchte mit select * from kunden where strasse like "%_3"; alle Strassen die nur eine Drei als Hausnummer besitzen.

    Momentan bekomme ich alle Datensätze in dessen Strasse überhaupt eine Drei steckt.

    bist du dir da sicher? Ich nehme jetzt mal einfach an, dass du MYSQL benutzt. Außerdem nehme ich mal an, die Hausnummer ist als String abgespeichert - was vielleicht wegen solchen Sachen wie 3A oder 4 c auch Sinn macht... Ich habe deinen Ausdruck dann mal ausprobiert. Der sollte nämlich alles finden, was zuerst beliebig viele (auch 0) Zeichen enthält, dann _ein_ beliebiges Zeichen und dann noch eine 3

    Es werden also (zum Beispiel) gefunden:
    13
    23
    333
    33333333

    Nicht gefunden werden (zum Beispiel):
    3
    232
    131
    3723468
    4678468
    246828

    Wenn du alle Straßen haben willst, die nur die 3 als Hausnummer haben, benutze einfach

    select * from kunden where strasse="3";

    Wenn du alle Straßen haben willst, in deren Hausnummer irgendwo eine 3 steht, kannst du folgendes verwenden

    select * from kunden where strasse like "%3%";

    Wenn du alle Straßen haben willst, in deren Hausnummer nur _eine_ 3 vorkommt, wird es etwas schwieriger. Da müßte ich mich auch erstmal kundig machen

    Liebe Grüße mbr

  3. yo,

    ich möchte mit select * from kunden where strasse like "%_3"; alle Strassen die nur eine Drei als Hausnummer besitzen.

    dein datenmodell liegt ganz offensichtlich nicht in atomarer form vor, da straßenname und hausnummer zusammen als ein atttribut gespeichert sind. demzufolge hast du nun auch ein wenig schwierigkeiten, die hausnummer nach bestimmten kriterien herauszufiltern.

    der beste weg wäre es also, den straßenname und die hausnummer in jeweils eine eigene spalte einzutragen, dann wird die abfrage sehr einfach. mit der obigen abfrage bekommst du alle adressen,die am "ende" eine 3 zu stehen haben, das könnte aber auch hausnummer 43 sein.

    solltest du das tabellen-design nicht verändern können, dann wäre es hilfreich zu wissen, wie die spalte genau aufgebaut ist, sprich welcher typ und welche werte enthält sie.

    Ilja

    1. Hallo Ilja,

      dein datenmodell liegt ganz offensichtlich nicht in atomarer form vor, da straßenname und hausnummer zusammen als ein atttribut gespeichert sind. demzufolge hast du nun auch ein wenig schwierigkeiten, die hausnummer nach bestimmten kriterien herauszufiltern.

      Das verstösst wohl eindeutig gegen die erste Normalform der Normalisierung von Relationen?
      Wo es ja heisst das nur genau ein Wert pro Attribut enthalten sein darf.

      der beste weg wäre es also, den straßenname und die hausnummer in jeweils eine eigene spalte einzutragen, dann wird die abfrage sehr einfach. mit der obigen abfrage bekommst du alle adressen,die am "ende" eine 3 zu stehen haben, das könnte aber auch hausnummer 43 sein.

      Das stimmt, am Ende ist immer eine drei zu finden.

      solltest du das tabellen-design nicht verändern können, dann wäre es hilfreich zu wissen, wie die spalte genau aufgebaut ist, sprich welcher typ und welche werte enthält sie.

      Es handelt sich bei diesem Attribut um ein varchar(25).

      bis dann  Nostra

      1. yo,

        Das verstösst wohl eindeutig gegen die erste Normalform der Normalisierung von Relationen?

        in deinem falle ja....

        Wo es ja heisst das nur genau ein Wert pro Attribut enthalten sein darf.

        ...aber das stimmt nicht, es können durch aus mehrere "werte" in einer spalte stehen. die bedeutung von atomar bezüglich datenbank-design wird leider immer wieder falsch verstanden und wird auch in den meisten fachbüchern falsch erklärt. aber ds ist ein anderes thema.

        Es handelt sich bei diesem Attribut um ein varchar(25).

        wie gesagt,m ich würde das daten-design ändern und zwei spalten draus machen. falls das nicht geht und nur wenn das nicht geht, dann musst du versuchen, allgemeingültige regeln aufzustellen, wie du die hausnummer aus dem string extrahieren kannst. das letzte vorkommen leerzeichen könnte solch eine regel sein, wobei adressenzusätze wie 19 b das wieder zunichte machen könnten, bzw. dann darauf geachtet werden muss, dass das letzt zeichen ein buchstabe ist. das wird aber alles sehr kompliziert und deshlab noch mal mein aufruf zum ändern des daten-designs....

        Ilja

        1. Hallo Ilja,

          ...aber das stimmt nicht, es können durch aus mehrere "werte" in einer spalte stehen. die bedeutung von atomar bezüglich datenbank-design wird leider immer wieder falsch verstanden und wird auch in den meisten fachbüchern falsch erklärt. aber ds ist ein anderes thema.

          dieses Thema interresiert mich schon, nenn doch ein Beispiel und wenn es schon sooft falsch ist, stell es doch bitte richtig!

          Vielleicht kennst du auch eine gute Seite.

          Es handelt sich bei diesem Attribut um ein varchar(25).

          wie gesagt,m ich würde das daten-design ändern und zwei spalten draus machen. falls das nicht geht und nur wenn das nicht geht, dann musst du versuchen, allgemeingültige regeln aufzustellen, wie du die hausnummer aus dem string extrahieren kannst. das letzte vorkommen leerzeichen könnte solch eine regel sein, wobei adressenzusätze wie 19 b das wieder zunichte machen könnten, bzw. dann darauf geachtet werden muss, dass das letzt zeichen ein buchstabe ist. das wird aber alles sehr kompliziert und deshlab noch mal mein aufruf zum ändern des daten-designs....

          in der Anfrgae soll ich die Regeln aufstellen, könntest du auch hier ein Beispiel nennen?

          Nostra

          1. yo,

            in der Anfrgae soll ich die Regeln aufstellen, könntest du auch hier ein Beispiel nennen?

            nun die alles entscheidene frage hast du noch nicht beantwortet, wird nun das tabellen-layout in zwei spalten geändert oder nicht ?

            Ilja

            1. Hallo,

              in der Anfrgae soll ich die Regeln aufstellen, könntest du auch hier ein Beispiel nennen?

              nun die alles entscheidene frage hast du noch nicht beantwortet, wird nun das tabellen-layout in zwei spalten geändert oder nicht ?

              Diese nich aber vielleicht die nächste.
              Ich möchte halt auch gern wissen wie ich es ohne Aufteilung schaffe.

              bis dann, Nostra

              1. yo,

                Ich möchte halt auch gern wissen wie ich es ohne Aufteilung schaffe.

                das wissen dazu hast du selbst, indem du die werte der spalte analysierst, sprich wwas sind die genauen spezifikationen der spalte und wie kann ich damit dann die hausnummer extrahieren. nur wenn sich dabei regelmäßigkeiten erkennen lassen, ist es möglich.

                beispeil, es gibt ein sonderzeichen, dass den straßenname von der hausnummer trennt. dann kannst du dieses sonderzeichen nehmen, um geeignete funktionen dafür einzustzen. ist es nur ein leerzeichen, dann musst du dir darüber gedanken machen, ob noch andere leerzeichen vorkommen können, ob es immer das letzt leerzeichen ist, dass sie trennt, etc.

                all das sind vorüberlegungen, die nur du leisten kannst. und daran leitest du die funktionen ab, die dann genau den teil extrahieren, den du brauchst.

                Ilja