Paule: mysql: CASE in WHERE ?

Hallo,

ich bräuchte eine CASE Fallunterscheidung in einer WHERE Klausel.

Kennt mysql das?

Konkret:

Ich habe eine Datumsspalte und eine Wiederholungsspalte, es geht ium Erinnerungsmails, die versendet werden sollen.

Die Wiederholungsspalte kennt

  • 0 für keine Wiederholung
  • tag für tägliche Wiederholung
  • 1tag für einmalige tägliche Wiederholung
  • 2tag für zweimalige tägliche Wiederholung
  • 3tag für dreimaige tägliche Wiederholung
  • woche für wöchentliche Wiederholung
  • monat für monatliche Wiederholung
  • quartal für quartalsweise Wiederholung
  • jahr für jährliche Wiederholung

Ich würde gerne bereits über die Query selektieren, ob eine Erinnerungsmail versendet wird oder nicht, das bedeutet, ich müßte in der WHERE-Klausel das aktuelle Datum mit der Datumsspalte (ggf. ergänzt um die Wiederholungsspalte) vergleichen.

Kriegt man das in einer Query hin?

Paul

  1. Tach!

    ich bräuchte eine CASE Fallunterscheidung in einer WHERE Klausel.

    Kennt mysql das?

    Ja. MySQL hat auch eine gute Dokumentation. Für deinen Fall wäre das der Abschnitt Functions and Operators und da weiter bei Control Flow.

    Kriegt man das in einer Query hin?

    Vermutlich. Bist du schon auf Probleme gestoßen?

    dedlfix.

    1. Hi dedlfix,

      Ja. MySQL hat auch eine gute Dokumentation. Für deinen Fall wäre das der Abschnitt Functions and Operators und da weiter bei Control Flow.

      Ja, ungefährt dort hatte ich auch schon geguckt.

      Vermutlich. Bist du schon auf Probleme gestoßen?

      Und ob. :-)

      ...
      WHERE
      (CASE
      WHEN t1.wiederholung = '0' THEN t1.datum = curdate() ...
      ...
      

      Hier fehlt mir einfach noch irgend etwas.

      Ich will ja sagen: Wenn Spalte t1.wiederholung '0' ist, dann gilt die Bedingung "wenn t1.datum dem heutigen Datum entspricht. Das sage ich aber nicht. Und ich weiß nicht, was dort fehlt.

      Paul

      1. Tach,

        ...
        WHERE
        (CASE
        WHEN t1.wiederholung = '0' THEN t1.datum = curdate() ...
        ...
        

        Ich will ja sagen: Wenn Spalte t1.wiederholung '0' ist, dann gilt die Bedingung "wenn t1.datum dem heutigen Datum entspricht. Das sage ich aber nicht. Und ich weiß nicht, was dort fehlt.

        Wenn zwei Bedingungen greifen sollen, kannst du sie mit AND verknüpfen, CASE unterhalb von WHERE ergibt eher keinen großen Sinn, weil du als Rückgabe im wesentlichen eh nur Booleans erzeugen kannst.

        WHERE
          t1.wiederholung = '0' AND t1.datum = curdate() OR

        mfg
        Woodfighter

        1. Wenn zwei Bedingungen greifen sollen, kannst du sie mit AND verknüpfen, CASE unterhalb von WHERE ergibt eher keinen großen Sinn, weil du als Rückgabe im wesentlichen eh nur Booleans erzeugen kannst.

          WHERE
            t1.wiederholung = '0' AND t1.datum = curdate() OR

          Das stimmt. Ok, da hätte ich drauf kommen können. Danke für die Hilfe

          Jetzt noch die Datumsfunktionen hinbekommen, könnte sein, dass ich da nochmal Eure Hilfe bemühen muß.

          Paul

          1. Jetzt noch die Datumsfunktionen hinbekommen, könnte sein, dass ich da nochmal Eure Hilfe bemühen muß.

            Da haben wir es schon.

            Ich bin jetzt so weit:

            WHERE
            ... AND
            (t1.wiederholung = '0' AND t1.datum  = curdate())
            OR (t1.wiederholung = 'tag' AND t1.datum >= curdate())
            OR ( t1.wiederholung = '1tag' AND (t1.datum >= curdate() AND t1.datum <= CURDATE() + INTERVAL 1 DAY) )
            OR ( t1.wiederholung = '2tag' AND (t1.datum >= curdate() AND t1.datum <= CURDATE() + INTERVAL 2 DAY) )
            OR ( t1.wiederholung = '3tag' AND (t1.datum >= curdate() AND t1.datum <= CURDATE() + INTERVAL 3 DAY) )
            

            Aber wie mache ich sql klar, dass ich wöchentlich erinnern möchte?

            OR ( t1. wiederholung = 'woche' AND (t1.datum ... 
            

            Und dann? Gibt es so etwas wie eine "weekly" Funktion oder kann man sie basteln?

            Paul

            1. Tach,

              Aber wie mache ich sql klar, dass ich wöchentlich erinnern möchte?

              dafür musst du entweder abspeichern, wann zuletzt erinnert wurde, dafür sorgen dass die wöchentlichen Erinnerungen immer am selben Wochentag stattfinden oder ein Intervall zu einem festen Tag, der zum Datensatz gehört (z.B. Timestamp des Eintragens oder falls es um Termine geht, den Termin selber), haben.

              mfg
              Woodfighter

              1. Tach,

                Aber wie mache ich sql klar, dass ich wöchentlich erinnern möchte?

                dafür musst du entweder abspeichern, wann zuletzt erinnert wurde, dafür sorgen dass die wöchentlichen Erinnerungen immer am selben Wochentag stattfinden oder ein Intervall zu einem festen Tag, der zum Datensatz gehört (z.B. Timestamp des Eintragens oder falls es um Termine geht, den Termin selber), haben.

                Hi Woodfighter,

                hab ich mir auch gedacht und habe die Tabelle umgestrickt. Ich habe jetzt den Termin der nächsten Ausführung, den ich jeweils nach Ausführung dann um das jeweilige Intervall updaten muß. Erstelldatum habe ich auch gespeichert, das hat aber eher philosophischen Wert. Tag der Erstausführung habe ich auch gespeichert, aber auch das hat (nach der ersten Auführung dann nur noch philosophischen Wert). Im Gegenzug wird natürlich die SELECT Query sehr einfach, mit dem Nachteil einer neuen Update Query versteht sich.

                Danke für Deine (und dedlfix) Hilfe.

                Ich denke, ab hier komme ich klar.

                Paul