Ankündigung

Einklappen
Keine Ankündigung bisher.

Verständnisfrage zu IF in WHERE

Einklappen

Neue Werbung 2019

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

  • Verständnisfrage zu IF in WHERE

    Ich habe eine etwas nervige Abfrage, die mich nicht zum gewünschten Ergebnis lassen will.

    Ist das Folgende möglich?
    Code:
    WHERE
      IF(a.id = 1, a.id = 1, FALSE)
      AND
      IF(b.id = 1, b.id = 1, FALSE)
      ...
    Ich muss mehrere Bedingungen prüfen und ggf. verknüpfen.
    Aber ich bin mir nicht sicher, ob das so geht, denn es kommt par tout nicht das heraus was ich brauche.

    Es tritt immer der "Sonst"-Fall bzw. die EXPR3 ein, auch wenn die Werte stimmen und die ID 1 ist.

  • #2
    Was möchtest du denn abfragen?

    Kommentar


    • #3
      Dein IF() ist bei dieser Konstellation völlig überflüssig.

      WHERE a.id = 1 AND b.id = 1

      trifft es einfacher und genauso.

      Kommentar


      • #4
        @Chriz
        Diese Abfrage soll aber flexibel sein.
        Es kommt vor, dass mal kein a.id vorhanden ist, andererseits kann auch mal kein b.id vorhanden sein und als dritte Variante können beide Bedingungen zutreffen.

        Daher hatte ich auch schon solch ein Konstrukt versucht, aber es kamen völlig falsche Werte als Ergebnis,
        sprich die Bedingung greift scheinbar nicht.
        Code:
        IF(a.id = 1 AND b.id = 1, 
           a.id = 1 AND b.id = 1,
           IF(a.id = 1, 
              a.id = 1,
              IF(b.id = 1, 
                 b.id = 1, 
                 FALSE)
            )
        )

        Kommentar


        • #5
          Zitat von ph|L Beitrag anzeigen
          Was möchtest du denn abfragen?
          Sagen wir mal so, das ganze Konstrukt ist zu groß, um alles zu zeigen.
          An sich funktioniert es auch.
          Ich brauche nur für einige Selektionen der Daten eine ausgefeiltere WHERE-Bedingung.

          Kommentar


          • #6
            Sorry, solange Du nicht konkret wirst, wird Dir niemand nen Rat geben können.

            Kommentar


            • #7
              Wie konkret soll ich denn werden?
              Meine Frage war doch nur, ob so eine IF-Bedingung innerhalb eines WHERE-Statements funktioniert.

              Wenn ich diese Bedingung stelle:
              Code:
              WHERE
                IF(a.id = 1, a.id = 1, FALSE)
                AND
                IF(b.id = 1, b.id = 1, FALSE)
                ...
              ... und ein Treffer bei "a.id = 1" aufkommt, wie sieht dann das Konstrukt aus?
              So:
              Code:
              WHERE
                a.id = 1 
                AND
                IF(b.id = 1, b.id = 1, FALSE)
                ...
              Ich habe nämlich die Vermutung, dass bei einem Treffer nicht die EXPR2 bzw. die "Dann"-Aktion so übergeben/ausgeführt wird, wie ich es geschrieben habe.

              Kommentar


              • #8
                IF(a.id = 1, a.id = 1, FALSE)

                wenn a.id == 1 ist ist die Bedingung erfüllt (TRUE)
                zurückgegeben wird dann der erste Ausdruck. Und da wir gerade gesagt haben, dass a.id == 1 TRUE ist, ist der Ausdruck eben auch TRUE
                wenn a.id != 1 ist ist die Bedingung nicht erfüllt (FALSE)
                zurückgegeben wird dann der erste Ausdruck. FALSE

                zusammenfassend
                wenn a.id == 1 TRUE, Rückgabe TRUE sonst FALSE. Das ist exakt das, was der Ausdruck a.id = 1 alleine bereits ohne IF leistet.

                Darum frage ich, weil Dein gesamtes Konstrukt keinen Sinn macht und Du angedeutet hast, dass die Logik evtl. komplexer ist. Wenn Du hier aber brotkrümelweise Dein Problem lösen willst, weil Du Angast hast, jemand guckt Dir hier was ab, dann bin ich raus aus dem Thread.

                Kommentar


                • #9
                  IF(a.id = 1, a.id = 1, FALSE)

                  wenn a.id == 1 ist ist die Bedingung erfüllt (TRUE)
                  zurückgegeben wird dann der erste Ausdruck. Und da wir gerade gesagt haben, dass a.id == 1 TRUE ist, ist der Ausdruck eben auch TRUE
                  wenn a.id != 1 ist ist die Bedingung nicht erfüllt (FALSE)
                  zurückgegeben wird dann der erste Ausdruck. FALSE

                  zusammenfassend
                  wenn a.id == 1 TRUE, Rückgabe TRUE sonst FALSE. Das ist exakt das, was der Ausdruck a.id = 1 alleine bereits ohne IF leistet.

                  Darum frage ich, weil Dein gesamtes Konstrukt keinen Sinn macht und Du angedeutet hast, dass die Logik evtl. komplexer ist. Wenn Du hier aber brotkrümelweise Dein Problem lösen willst, weil Du Angast hast, jemand guckt Dir hier was ab, dann bin ich raus aus dem Thread.

                  Kommentar


                  • #10
                    Zitat von timok Beitrag anzeigen
                    @Chriz
                    Diese Abfrage soll aber flexibel sein.
                    Es kommt vor, dass mal kein a.id vorhanden ist, andererseits kann auch mal kein b.id vorhanden sein und als dritte Variante können beide Bedingungen zutreffen.
                    Wenn in der Tabelle "a" keine Spalte "id" existiert, kannst du diese in SQL nicht abfragen. Auch dein IF Konstrukt würde einen Fehler "Unknown column a.id" werfen.

                    Ich kenne zumindest keine Möglichkeit, mit der du die Existenz einer Spalte in einem Query abfragen kannst.

                    Wenn immer beide Spalten vorhanden sind, und sich die Werte nur ändern:

                    Code:
                    WHERE
                      (a.id = 1 AND b.id = 1) XOR (a.id = 1 XOR b.id = 1)
                    Verkürzt

                    Code:
                    WHERE
                      a.id = 1 OR b.id = 1
                    Wenn du weder die Existenz der Spalten noch deren Wert abfragen willst brauchen wir, wie nikosch schon verlangte, mehr Infos um dein Problem verstehen zu können.

                    Kommentar


                    • #11
                      Ok, vielen Dank für die Erklärung.
                      Mein Versuch war nämlich bei zutreffender Bedingung im IF daraufhin eine Bedingung zu setzen.
                      Aber da fehlte mir das Verständnis für das IF. Ich kann hiernach also nur auf eine Bedingung prüfen und dann einen Wert ausgeben, aber keine Bedingung festlegen von der der weitere Verlauf abhängt.

                      Die Spalten existieren definitiv.
                      Nur hängt von der ersten Bedingung der weitere Verlauf ab, denn wenn eine ID nicht vorkommt, darf in den Zeilen darunter nicht mehr danach gefragt werden. Darauf wollte ich hinaus.

                      Ich werde das Problem mal umwandeln, damit ich es hier zeigen kann.
                      Mein Problem ist nicht die Angst, dass es jemand "abguckt", eher das ich einen Vertrag unterschrieben habe, der mir die Veröffentlichung untersagt.

                      Kommentar


                      • #12
                        Zitat von timok Beitrag anzeigen
                        Nur hängt von der ersten Bedingung der weitere Verlauf ab, denn wenn eine ID nicht vorkommt, darf in den Zeilen darunter nicht mehr danach gefragt werden. Darauf wollte ich hinaus.
                        Wenn du die Bedingung erstmalig geprüft hast, und das Ergebnis false war lässt du Sie später weg?

                        Das ergibt keinen Sinn. Wenn eine Bedingung nicht zutrifft die Bedingung wegzulassen macht die gesamte Bedingung überflüssig da sie entweder wahr oder nicht vorhanden ist.

                        Kommentar


                        • #13
                          So, ich denke mal mit etwas Fantasie hat das doch noch geklappt.

                          Es gibt Partner, die mehrere Hotels und Restaurants besitzen oder auch nur einen der beiden.
                          Der Zulieferer hat Verträge mit Hotels und Restaurants.
                          Die Gesamtansicht klappt. Man sieht alle Zulieferer und diejenigen Hotels und Restaurants, die unter Vertrag stehen.
                          Jetzt soll aber ein Partner selektiert werden, damit nur die Hotels und Restaurants angezeigt werden, die bei den Zulieferern unter Vertrag stehen.

                          Und hier stirbt meine Logik in der WHERE-Bedingung.

                          Wie gesagt, ein Partner kann ein Hotel haben, muss aber kein Restaurant besitzen. Dadurch schiesse ich mich ins Aus mit der Bedingung "AND phr.id_partner = 1".
                          Daraufhin hängt die nachfolgende Bedingung ab. Wenn ein Partner kein Restaurant besitzt, dann darf ich anschließend auch keinen Vergleich mehr mit den IDs setzen, der aber wiederum zwingend notwendig ist, um nicht falsche Daten aus der anderen Tabelle abzurufen.

                          Code:
                          ...
                          WHERE
                            SELECT 
                                *
                              FROM 
                                partner_hat_hotel as phh,
                                partner_hat_restaurant as phr,
                                zulieferer as z
                              WHERE 
                                phh.id_partner = 1
                                AND
                                phr.id_partner = 1
                                AND
                                (IF(phh.id_hotel <> 0, phh.id_hotel = z.id_hotel, FALSE)
                                OR
                                IF(phr.id_restaurant <> 0, phr.id_restaurant = z.id_restaurant, FALSE))
                                AND
                                phh.id_rolle = 2
                                AND
                                phr.id_rolle = 2
                              GROUP BY
                                z.id_zulieferer,
                                z.id_restaurant,
                                z.id_hotel
                          ...
                          Mit qualmt der Kopf schon seit Tagen wegen diesem Problem.

                          Ok, ein paar Daten zum Spielen:

                          partner_hat_hotel
                          id_partner | id_hotel | id_rolle
                          -----------------------------
                          1 | 1 | 2
                          2 | 2 | 2
                          3 | 0 | 0

                          partner_hat_restaurant
                          id_partner | id_restaurant | id_rolle
                          ----------------------------------
                          1 | 0 | 0
                          2 | 1 | 2
                          3 | 2 | 2

                          zulieferer
                          id_zulieferer | id_hotel | id_restaurant
                          ----------------------------------
                          1 | 1 | 0
                          2 | 2 | 1
                          3 | 0 | 3

                          Diese drei Möglichkeiten der beiden Partnertabellen möchte ich gerne in der WHERE-Bedingung abfangen.

                          Kommentar


                          • #14
                            Zitat von Dark Guardian Beitrag anzeigen
                            Wenn du die Bedingung erstmalig geprüft hast, und das Ergebnis false war lässt du Sie später weg?

                            Das ergibt keinen Sinn. Wenn eine Bedingung nicht zutrifft die Bedingung wegzulassen macht die gesamte Bedingung überflüssig da sie entweder wahr oder nicht vorhanden ist.
                            Das ist scheinbar gerade auch mein Problem. Ich weiß im Moment schon gar nicht mehr wo der Sinn und Unsinn ist.

                            Nur mir fällt hierzu einfach keine andere Lösung ein.
                            Durch diese 3 möglichen Bedingungen, die ich erst überprüfen muss, macht es leider diese Riesenprobleme.

                            Kommentar


                            • #15
                              Ich seh im Beispiel leider nicht wirklich durch.

                              Kommentar

                              Lädt...
                              X